parent
2e10fcdaa0
commit
dbb7c3d58d
@ -0,0 +1,114 @@
|
|||||||
|
Requirements gathering:
|
||||||
|
Main objectives:
|
||||||
|
1) Understand the problem
|
||||||
|
2) Understand how software is supposed to solve that problem
|
||||||
|
Asking questions to aim discussion and to build your understanding
|
||||||
|
Observe current process / workflows
|
||||||
|
Determine common usage scenarios / stories
|
||||||
|
Use active listening
|
||||||
|
Problem solving:
|
||||||
|
How to facilitate a brainstorming session
|
||||||
|
* Enumerate possible solutions (no critiquing or arguing in this stage)
|
||||||
|
* Jot down ideas for everyone to see, as they are generated.
|
||||||
|
* When things slow down, identify the good qualities of various ideas that were proposed
|
||||||
|
* Narrow it down to one or two possible plans of action
|
||||||
|
Requirements document (mainly consider the system as a black box in the context of the problem domain):
|
||||||
|
Entities and attributes
|
||||||
|
Relations, cardinalities, and entity-relation diagrams
|
||||||
|
Events and sequence
|
||||||
|
Queries and notifications
|
||||||
|
System specification:
|
||||||
|
What the system will look like
|
||||||
|
How it will behave in response to input (users / sensors / other software)
|
||||||
|
Operating procedures
|
||||||
|
Prototyping
|
||||||
|
User interface design:
|
||||||
|
* Consistency (within the application and with similar applications)
|
||||||
|
* Provide easy navigation (logical hierarchy: navigating menus or tools for more options; multiple ways to carry out an action where it's natural to do so)
|
||||||
|
* Provide informative feedback (e.g. password strength)
|
||||||
|
* Design workflows to yield closure (e.g. "purchase complete", "file saved")
|
||||||
|
* Prevent user errors (e.g. "are you sure you want to exit without saving?")
|
||||||
|
* Allow users ways to reverse their actions easily (e.g. undo, redo, cancel, and exit)
|
||||||
|
* Avoid surprises and changes in behavior
|
||||||
|
* Minimize the user's memory load (avoid having to remember things in order to perform a task, e.g. "I forgot that I already bought that book.")
|
||||||
|
* Aim for clarity (quickly and easily understand what something does)
|
||||||
|
* Use visual hierarchy (size, color, font, white space, and negative space) to illustrate what is important and what groups together
|
||||||
|
* Design for flexibility: Accommodate different user skill levels (e.g. mouse vs keyboard shortcuts, advanced features, filters) and disabilities (color contrast, screen reader, easy tab key navigation, for web: different devices)
|
||||||
|
* Lead the user to formulate a good mental model of what happens internally
|
||||||
|
Software development life cycle models:
|
||||||
|
Types: Waterfall / incremental / iterative / spiral / agile / evolutionary / code & fix
|
||||||
|
Considerations: requirement stability, schedule constraints, team skills, human factors, visibility, parallelizablity
|
||||||
|
Language selection:
|
||||||
|
Familiarity vs suitabilitiy for the task at hand
|
||||||
|
System-level design:
|
||||||
|
Technology selection
|
||||||
|
Feasibility
|
||||||
|
File formats
|
||||||
|
Database management system selection and design
|
||||||
|
Performance
|
||||||
|
Scalability
|
||||||
|
Security
|
||||||
|
Error processing & fault tolerance
|
||||||
|
Databases:
|
||||||
|
SQL:
|
||||||
|
Properties (ACID):
|
||||||
|
Atomic - either all of the transaction takes affect, or none of it (including under power failures and crashes)
|
||||||
|
Consistent - database invariants are maintained (constraints, triggers, referential integrity, etc.)
|
||||||
|
Isolated - transactions are executed as if they were sequential
|
||||||
|
Durable - committed transactions are never forgotten (i.e. they stored to non-volatile memory)
|
||||||
|
Basic operations (CRUD) and their associated SQL statements:
|
||||||
|
Create (INSERT)
|
||||||
|
Retrieve (SELECT)
|
||||||
|
Update (UPDATE)
|
||||||
|
Delete (DELETE)
|
||||||
|
NoSQL:
|
||||||
|
Useful when you need high-performance at a huge scale, with little or no relation between tables
|
||||||
|
Class-level design:
|
||||||
|
Main focus (managing complexity):
|
||||||
|
Limit the amount of complexity we deal with at a time
|
||||||
|
Limit the effects when a change is made to the code
|
||||||
|
Abstraction (a class should represent one coherent abstraction or concept)
|
||||||
|
Information hiding / encapsulation (outside a class, you should not have to understand the internal implementation)
|
||||||
|
Loose coupling
|
||||||
|
High cohesion
|
||||||
|
Guide to design: "How will this class be used?"
|
||||||
|
Code reuse opportunities
|
||||||
|
Other tips:
|
||||||
|
* Every constructor and public method should leave the instance variables in a consistent and correct state for the next public method call
|
||||||
|
* Generally avoid going over 7 (plus or minus 2) instance variables in a class.
|
||||||
|
* Do not repeat data unless truly necessary.
|
||||||
|
* Do not give variables more scope than they require.
|
||||||
|
Immutable objects
|
||||||
|
Benefits:
|
||||||
|
Thread-safe
|
||||||
|
Can freely share pointers to objects; no hidden side effects if something changes
|
||||||
|
Drawback:
|
||||||
|
If there are lots of changes then immutability may result in memory burn and slowdowns
|
||||||
|
Method-level design:
|
||||||
|
* Naming
|
||||||
|
* Give descriptive names that say exactly what the routine does (usually verb-noun)
|
||||||
|
* The name should include or imply the return type
|
||||||
|
* Size
|
||||||
|
* Functions over a couple hundred lines of code tend to be more error-prone
|
||||||
|
* Otherwise, no hard constraints on method length - whatever is natural for the situation
|
||||||
|
* Parameters
|
||||||
|
* Use parameter order consistently among different functions
|
||||||
|
* Document assumptions on parameters
|
||||||
|
* Document units
|
||||||
|
* Document zero-based-counting vs one-based-counting if not obvious
|
||||||
|
* Error handling
|
||||||
|
* Check values of input parameters
|
||||||
|
* Use assertions to check for bugs. Use error handling to check for bad input.
|
||||||
|
* Techniques for error handling:
|
||||||
|
* Return null or neutral value
|
||||||
|
* Print or log the error and continue execution
|
||||||
|
* Throw an exception/error
|
||||||
|
* Terminate the program
|
||||||
|
Control structures:
|
||||||
|
When should you use break or continue in a loop?
|
||||||
|
* When it makes your code easier to read/maintain/understand as opposed to working it into the boolean condition for the loop.
|
||||||
|
* The danger of using break or continue in a large loop is that it becomes 'hidden' and people might not realize that something inside the loop affects its control flow.
|
||||||
|
What are the advantages/disadvantages of switch...case?
|
||||||
|
+ The expression is only checked once in one place, and would only need to changed in one place
|
||||||
|
+ You can exploit the fall-through behavior.
|
||||||
|
- You have to keep putting 'break;' at the end of each case if you don't want the case to "fall through". If you forget, it still compiles.
|
Loading…
Reference in new issue