Skip to content

Commit 02d8a58

Browse files
committed
Added 'next' links for intermediate section. Updated some typos as well
1 parent 9b2b2a2 commit 02d8a58

25 files changed

+49
-5
lines changed

2-Intermediate/Judgement/01-How to Tradeoff Quality Against Development Time.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ If she still insists you should try to isolate the shoddiness into particular co
88

99
NinjaProgrammer at Slashdot sent in this gem:
1010

11-
> Remember that a good design will be resillient against poor code implementations. If good interfaces and abstractions exist throughout the code, then the eventual rewrites will be far more painless. If it is hard to write clear code that is hard to fix, consider what is wrong with the core design that is causing this.
11+
> Remember that a good design will be resillient against poor code implementations. If good interfaces and abstractions exist throughout the code, then the eventual rewrites will be far more painless. If it is hard to write clear code that is hard to fix, consider what is wrong with the core design that is causing this.

2-Intermediate/Judgement/02-How to Manage Software System Dependence.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ Modern software systems tend to depend on a large number of components that may
99
It is always best to encapsulate the component in some way so that it is isolated and so that it can be swapped out. If the component proves to be completely unworkable, you may be able to get a different one, but you may have to write your own. Encapsulation is not portability, but it makes porting easier, which is almost as good.
1010

1111
Having the source code for a component decreases the risk by a factor of four. With source code, you can evaluate it easier, debug it easier, find workarounds easier, and make fixes easier. If you make fixes, you should give them to the owner of the component and get the fixes incorporated into an official release; otherwise you will uncomfortably have to maintain an unofficial version.
12+
13+
Next [How to Device if Software is Too Immature](03-How to Decide if Software is Too Immature.md)

2-Intermediate/Judgement/03-How to Decide if Software is Too Immature renamed to 2-Intermediate/Judgement/03-How to Decide if Software is Too Immature.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,5 @@ Using software other people wrote is one of the most effective ways to quickly b
1414
10. Can you hire people to work on it even if it is bad?
1515

1616
A little consideration of these criteria demonstrates the great value of well-established free software and open-source software in reducing risk to the entrepreneur.
17+
18+
Next [How to Make a Buy vs. Build Decision](04-How to Make a Buy vs Build Decision.md)

2-Intermediate/Judgement/04-How to Make a Buy vs Build Decision.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,5 @@ An entrepreneurial company or project that is trying to accomplish something wit
1313
You should think twice before building something that is big enough to serve as the basis for an entire other business. Such ideas are often proposed by bright and optimistic people that will have a lot to contribute to your team. If their idea is compelling, you may wish to change your business plan; but do not invest in a solution bigger than your own business without conscious thought.
1414

1515
After considering these questions, you should perhaps prepare two draft project plans, one for building and one for buying. This will force you to consider the integration costs. You should also consider the long term maintenance costs of both solutions. To estimate the integration costs, you will have to do a thorough evaluation of the software before you buy it. If you can't evaluate it, you will assume an unreasonable risk in buying it and you should decide against buying that particular product. If there are several buy decisions under consideration, some energy will have to be spent evaluating each.
16+
17+
Next [How to Grow Professionally](05-How to Grow Professionally.md)

2-Intermediate/Judgement/05-How to Grow Professionally.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@ If you want to become a team leader, instigate the formation of consensus. If yo
77
Evaluate yourself. If you want to become a better programmer, ask someone you admire how you can become like them. You can also ask your boss, who will know less but have a greater impact on your career.
88

99
Plan ways to learn new skills, both the trivial technical kind, like learning a new software system, and the hard social kind, like writing well, by integrating them into your work.
10+
11+
Next [How to Evaluate Interviewees](06-How to Evaluate Interviewees.md)

2-Intermediate/Judgement/06-How to Evaluate Interviewees.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@ In doing this, you should also evaluate their ability to learn, which is far mor
1111
A reader has had good luck using a ‘take-home’ test for interviewees. This has the advantage that can uncover the interviewee that can present themselves well but can't really code - and there are many such people. I personally have not tried this technique, but it sounds sensible.
1212

1313
Finally, interviewing is also a process of selling. You should be selling your company or project to the candidate. However, you are talking to a programmer, so don't try to colour the truth. Start off with the bad stuff, then finish strong with the good stuff.
14+
15+
Next [How to Know When to Apply Fancy Computer Science](07-How to Know When to Apply Fancy Computer Science.md)

2-Intermediate/Judgement/07-How to Know When to Apply Fancy Computer Science.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@ The three most important considerations for the potential computer science techn
1111
- Will you be able to test and evaluate it effectively?
1212

1313
If a well-isolated algorithm that uses a slightly fancy algorithm can decrease hardware cost or increase performance by a factor of two across an entire system, then it would be criminal not to consider it. One of the keys to arguing for such an approach is to show that the risk is really quite low, since the proposed technology has probably been well studied, the only issue is the risk of integration. Here a programmer's experience and judgement can truly synergize with the fancy technology to make integration easy.
14+
15+
Next [How to Talk to Non-Engineers](08-How to Talk to Non-Engineers.md)

2-Intermediate/Judgement/08-How to Talk to Non-Engineers.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,5 @@ With your team, the basic assumptions and goals do not need to be restated often
1515
I love working with non-engineers. It provides great opportunities to learn and to teach. You can often lead by example, in terms of the clarity of your communication. Engineers are trained to bring order out of chaos, to bring clarity out of confusion, and non-engineers like this about us. Because we have technical judgement and can usually understand business issues, we can often find a simple solution to a problem.
1616

1717
Often non-engineers propose solutions that they think will make it easier on us out of kindness and a desire to do the right thing, when in fact a much better overall solution exists which can only be seen by synergizing the outsiders view with your technical judgement. I personally like Extreme Programming because it addresses this inefficiency; by marrying the estimation quickly to the idea, it makes it easier to find the idea that is the best combination of cost and benefit.
18+
19+
Next [Advanced skills](../../3-Advanced)

2-Intermediate/Personal-Skills/01-How to Stay Motivated.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@ Obviously, there are entire industries organized around motivational techniques
1111
- Try to either learn or teach something, however small, in each project.
1212

1313
Finally, if possible, measure the impact of your work in terms of something that will be personally motivating. For example, when fixing bugs, counting the number of bugs that I have fixed is not at all motivational to me, because it is independent of the number that may still exist, and is also affects the total value I'm adding to my company's customers in only the smallest possible way. Relating each bug to a happy customer, however, *is* personally motivating to me.
14+
15+
Next [How to be Widely Trusted](02-How to be Widely Trusted.md)

2-Intermediate/Personal-Skills/02-How to be Widely Trusted.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@
33
To be trusted you must be trustworthy. You must also be visible. If know one knows about you, no trust will be invested in you. With those close to you, such as your team-mates, this should not be an issue. You establish trust by being responsive and informative to those outside your department or team. Occasionally someone will abuse this trust, and ask for unreasonable favours. Don't be afraid of this, just explain what you would have to give up doing to perform the favour.
44

55
Don't pretend to know something that you don't. With people that are not team-mates, you may have to make a clear distinction between 'not knowing right off the top of my head' and 'not being able to figure it out, ever.'
6+
7+
Next [How to Tradeoff vs. Space](03-How to Tradeoff vs Space.md)

2-Intermediate/Personal-Skills/03-How to Tradeoff Time vs Space.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@ Time (processor cycles) and space (memory) can be traded off against each other.
1111
Improving the space/time trade-off can often change one or the other dramatically. However, before you work on this you should ask yourself if what you are improving is really the thing that needs the most improvement. It's fun to work on an algorithm, but you can't let that blind you to the cold hard fact that improving something that is not a problem will not make any noticeable difference and will create a test burden.
1212

1313
Memory on modern computers appears cheap, because unlike processor time, you can't see it being used until you hit the wall; but then failure is catastrophic. There are also other hidden costs to using memory, such as your effect on other programs that must be resident, and the time to allocate and deallocate it. Consider this carefully before you trade away space to gain speed.
14+
15+
Next [How to Stress Test](04-How to Stress Test.md)

2-Intermediate/Personal-Skills/04-How to Stress Test.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,5 @@ Knowing where the wall is is essential not only to moving the wall, but also to
1313
---
1414

1515
<sup>[1]</sup> "to hit"
16+
17+
Next [How to Balance Brevity and Abstraction](05-How to Balance Brevity and Abstraction.md)

2-Intermediate/Personal-Skills/05-How to Balance Brevity and Abstraction.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ Abstraction is key to programming. You should carefully choose how abstract you
55
There is a certain dogma associated with useful techniques such as *information hiding* and *object oriented programming* that are sometimes taken too far. These techniques let one code abstractly and anticipate change. I personally think, however, that you should not produce much speculative code. For example, it is an accepted style to hide an integer variable on an object behind mutators and accessors, so that the variable itself is not exposed, only the little interface to it. This does allow the implementation of that variable to be changed without affecting the calling code, and is perhaps appropriate to a library writer who must publish a very stable API. But I don't think the benefit of this outweighs the cost of the wordiness of it when my team owns the calling code and hence can recode the caller as easily as the called. Four or five extra lines of code is a heavy price to pay for this speculative benefit.
66

77
Portability poses a similar problem. Should code be portable to a different computer, compiler, software system or platform, or simply easily ported? I think a non-portable, short-and-easily-ported piece of code is better than a long portable one. It is relatively easy and certainly a good idea to confine non-portable code to designated areas, such as a class that makes database queries that are specific to a given DBMS.
8+
9+
Next [How to Learn New Skills](06-How to Learn New Skills.md)

2-Intermediate/Personal-Skills/06-How to Learn New Skills.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ A good mentor is no replacement for doing things yourself, but is a lot better t
99
Try to get your boss to let you have formal training, but understand that it often not much better than the same amount of time spent simply playing with the new skill you want to learn. It is, however, easier to ask for training than playtime in our imperfect world, even though a lot of formal training is just sleeping through lectures waiting for the dinner party.
1010

1111
If you lead people, understand how they learn and assist them by assigning them projects that are the right size and that exercise skills they are interested in. Don't forget that the most important skills for a programmer are not the technical ones. Give your people a chance to play and practice courage, honesty, and communication.
12+
13+
Next [Learn to Type](07-Learn to Type.md)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
# Learn to Type
22

33
Learn to touch-type. This is an intermediate skill because writing code is so hard that the speed at which you can type is irrelevant and can't put much of a dent in the time it takes to write code, no matter how good you are. However, by the time you are an intermediate programmer you will probably spend a lot of time writing natural language to your colleagues and others. This is a fun test of your commitment; it takes dedicated time that is not much fun to learn something like that. Legend has it that when Michael Tiemann was at MCC people would stand outside his door to listen to the hum generated by his keystrokes which were so rapid as to be indistinguishable.
4+
5+
Next [How to Do Integration Testing](08-How to Do Integration Testing.md)

2-Intermediate/Personal-Skills/08-How to Do Integration Testing.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@
33
Integration testing is the testing of the integration of various components that have been unit tested. Integration is expensive and it comes out in the testing. You must include time for this in your estimates and your schedule.
44

55
Ideally you should organize a project so that there is not a phase at the end where integration must explicitly take place. It is far better to gradually integrate things as they are completed over the course of the project. If it is unavoidable estimate it carefully.
6+
7+
Next [Communication Languages](09-Communication Languages.md)

2-Intermediate/Personal-Skills/09-Communication Languages.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@ UML is a rich formal system for making drawings that describe designs. It's beau
77
XML is a standard for defining new standards. It is not a solution to data interchange problems, though you sometimes see it presented as if it was. Rather, it is a welcome automation of the most boring part of data interchange, namely, structuring the representation into a linear sequence and parsing back into a structure. It provides some nice type- and correctness-checking, though again only a fraction of what you are likely to need in practice.
88

99
SQL is a very powerful and rich data query and manipulation language that is not quite a programming language. It has many variations, typically quite product-dependent, which are less important than the standardized core. SQL is the *lingua franca* of relational databases. You may or may not work in any field that can benefit from an understanding of relational databases, but you should have a basic understanding of them and they syntax and meaning of SQL.
10+
11+
Next [Heavy Tools](10-Heavy Tools.md)

2-Intermediate/Personal-Skills/11-How to analyse data.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@ Not so.
77
No matter at which stage you start looking at it, data is the main concern of a well designed application. If you look closely at how a business analyst gets the requirements out of the customer's requests, you'll realize that data plays a fundamental role. The analyst creates so called Data Flow Diagrams, where all data sources are identified and the flow of information is shaped. Having clearly defined which data should be part of the system, the designer will shape up the data sources, in terms of database relations, data exchange protocols, and file formats, so that the task is ready to be passed down to the programmer. However, the process is not over yet, because you (the programmer) even after this thorough process of data refinement, are required to analyse data to perform the task in the best possible way. The bottom line of your task is the core message of Niklaus Wirth, the father of several languages. "Algorithms + Data Structures = Programs." There is never an algorithm standing alone, doing something to itself. Every algorithm is supposed to do something to at least one piece of data.
88

99
Therefore, since algorithms don't spin their wheels in a vacuum, you need to analyse both the data that somebody else has identified for you and the data that is necessary to write down your code. A trivial example will make the matter clearer. You are implementing a search routine for a library. According to your specifications, the user can select books by a combination of genre, author, title, publisher, printing year, and number of pages. The ultimate goal of your routine is to produce a legal SQL statement to search the back-end database. Based on these requirements, you have several choices: check each control in turn, using a "switch" statement, or several "if" ones; make an array of data controls, checking each element to see if it is set; create (or use) an abstract control object from which inherit all your specific controls, and connect them to an event-driven engine. If your requirements include also tuning up the query performance, by making sure that the items are checked in a specific order, you may consider using a tree of components to build your SQL statement. As you can see, the choice of the algorithm depends on the data you decide to use, or to create. Such decisions can make all the difference between an efficient algorithm and a disastrous one. However, efficiency is not the only concern. You may use a dozen named variables in your code and make it as efficient as it can ever be. But such a piece of code might not be easily maintainable. Perhaps choosing an appropriate container for your variables could keep the same speed and in addition allow your colleagues to understand the code better when they look at it next year. Furthermore, choosing a well defined data structure may allow them to extend the functionality of your code without rewriting it. In the long run, your choices of data determines how long your code will survive after you are finished with it. Let me give you another example, just some more food for thought. Let's suppose that your task is to find all the words in a dictionary with more than three anagrams, where an anagram must be another word in the same dictionary. If you think of it as a computational task, you will end up with an endless effort, trying to work out all the combinations of each word and then comparing it to the other words in the list. However, if you analyse the data at hand, you'll realize that each word may be represented by a record containing the word itself and a sorted array of its letters as ID. Armed with such knowledge, finding anagrams means just sorting the list on the additional field and picking up the ones that share the same ID. The brute force algorithm may take several days to run, while the smart one is just a matter of a few seconds. Remember this example the next time you are facing an intractable problem.
10+
11+
Next [Team Skills - How to Manage Development Time](../Team-Skills/01-How to Manage Development Time.md)

2-Intermediate/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
- Personal Skills
44
- [How to Stay Motivated](Personal-Skills/01-How to Stay Motivated.md)
55
- [How to be Widely Trusted](Personal-Skills/02-How to be Widely Trusted.md)
6-
- [How to Tradeoff Time vs. Space](Personal-Skills/03-How to Tradeoff vs Space.md)
6+
- [How to Tradeoff Time vs. Space](Personal-Skills/03-How to Tradeoff Time vs Space.md)
77
- [How to Stress Test](Personal-Skills/04-How to Stress Test.md)
88
- [How to Balance Brevity and Abstraction](Personal-Skills/05-How to Balance Brevity and Abstraction.md)
99
- [How to Learn New Skills](Personal-Skills/06-How to Learn New Skills.md)
1010
- [Learn to Type](Personal-Skills/07-Learn to Type.md)
11-
- [How to Do Integration Testing](Personal-Skills/08-How to Do Integration.md)
11+
- [How to Do Integration Testing](Personal-Skills/08-How to Do Integration Testing.md)
1212
- [Communication Languages](Personal-Skills/09-Communication Languages.md)
1313
- [Heavy Tools](Personal-Skills/10-Heavy Tools.md)
1414
- [How to analyze data](Personal-Skills/11-How to analyze data.md)

0 commit comments

Comments
 (0)