List of PSI labs
- I haven't made enough mistakes
- for I have never missed a class.
- Today, I'm reaping the reward -
- I failed the most important test.
- I thought I learned,
- but I'm a fool, and
- barely now I understand,
- that all this time
- I built and ruled
- a tiny castle made of sand.
- If I had had some more,
- I'd save the world
- from grief and gore...
The PSI labs rely on two basic ideas to develop the "do it right" culture:
- A system will be used by people, therefore it has to be designed for people.
- A system will be maintained by programmers, therefore it has to be designed in such a way that it doesn't turn into those programmers' worst nightmare.
The labs will be focused on the typical mistakes made by programmers at the design phase. These errors may cause some obvious defects, but most often they are subtle and they only show up later in the lifetime of a program (usually it is when you think about adding some new features). In those circumstances you have two options:
- fix it with some ugly kludges
- throw the old program and re-write it from scratch (without repeating the old mistakes [probably making new ones:-])
Making mistakes is the most effective way of learning; the trick here is that I do all the "mistake making" and you do all the "learning".
- HCI, UI design, usability (Usability lab specs)
- Localization (Localization lab specs)
- Unicode vs ASCII, types of Unicode, BOM
- Special folder paths hardcoded
- Japanese 0x5C character
- Arabic RTL
- The Noteman fiasco, breaking the thing down into modules from the very beginning (Module decoupling specs)
- Data storage
- Data visualization
- Logging feature and post-mortem debugging (Logging module specs)
- Software installer
- Update checker
- Registration number verification
- Software update notification
- Playing nice with the security policies of the OS
- Microsoft application compatibility toolkit
- Vista UAC
- Where data should be written
- All users vs Current user
- GUI research tool (count the number of clicks on each widget, follow the user's clicking path, etc)
- Designing software with cross-platform support in mind
- Making the software 64-bit ready
- Pointer arithmetic
- Special data types
- Deploying the program (installer, etc)
- Copyright, protection
- Trial version mechanism
- Registration numbers, keygens, cracks and patches
- Documentation lab - using specialized tools to generate the documentation for a program.
- DocBook, LaTeX
- Various output formats (CHM, PDF, RTF, DOC), printable versions
- Separating style from contents
- Developing software with energy efficiency in mind
- High DPI screens (http://msdn.microsoft.com/en-us/library/dd464646(VS.85).aspx)
- People don't want to buy a quarter-inch drill. They want a quarter-inch hole.
- Machines should work. People should think. Richard Hamming
- Build a system that even a fool can use and only a fool will want to use it.
- Computers are unreliable, but humans are even more unreliable. Any system which depends on human reliability is unreliable. Gilb
- All models are wrong, some models are useful. George Box
- There are two ways of constructing a software design: one way is to make it simple so that there are obviously no deficiencies, and the other is to make it so complicated that there are no obvious deficiencies. C. Hoare
- Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. Martin Golding.
- If you find a solution and become attached to it, the solution may become your next problem.
- We'll cross that bridge when we come back to it later.
- 5 weeks of hard work can save you 5 days of planning.
- Walking on water and developing software from a specification is easy if both are frozen.