1. Google.
2. The only useful result is a Google cache with a pastebin with a stack trace similar to mine.
3. Examine the pastebin stack trace.
4. Find an embedded userid.
5. Google userid, find github account.
6. Msg user via github.
7. Get response, user doesn't remember solution but remembers they got it from IRC.
8. Search IRC logs.
9. Find response with a link to a commit.
10. Apply the change locally.
11. Profit!
I did that once. I had a problem with upgrading Eclipse on Mac, a quick googling of the error found no solution. So I investigated the problem, found the solution and wrote a blog post with that error message. That blog post now has several hundred comments thanking me for fixing their very issue.
> 2. The only useful result is a Google cache with a pastebin with a stack trace similar to mine.
I work on a product with a public bug tracker [1]. It's amusing how often the only useful hit for a problem I'm looking into will be the actual bug in my product that I'm working on.
I imagine the same thing must happen with open source projects all the time, but this is the first place I've worked where it's been the case with commercial software.
What defines profit in this case? I realize that this post was likely tongue-in-cheek, but I think my question is still valid. I'm trying to explore the answer to that question myself: http://blog.fogus.me/2011/02/28/the-keepers-of-answers/
But I'm not sure if I've hit on it yet. Maybe I should try Quora. ;-)
Valid question. The result in this case was getting a patch that was already committed into the development branch, just not yet released.
I actually did debug it (i.e. I found the cause of the bug, just didn't know whether fixing it in the most obvious place wouldn't break anything elsewhere - it occurs it might) but my fix would probably be suboptimal and I'd probably waste the developers' time with a superfluous bug report (and maybe the suboptimal patch too).
profit: From Middle English profit < Old French profit (French: profit). < Latin profectus (“advance, progress, growth, increase, profit”) < proficere (“to go forward, advance, make progress, be profitable or useful”); see proficient. http://en.wiktionary.org/wiki/profit
Similar use in French means something like "I took advantage [of it]".
...or it could just be a reference to the Underpants Gnomes...
I think, honestly, that this is a reasonably efficient workflow. Googling takes the place of 'ask a coworker' in situations where that's not possible.
Really, why spend 10 minutes noodling around trying to solve the problem via manuals/thinking, when you might get an answer in 30 seconds otherwise?
IMO, this post has a bit of "Get off my lawn" to it.
I've always encouraged the people I mentor to ask questions of people who may know before spending lots of time on a problem. You get the same level of learning, you get the same realizations, the only thing you skip is your wasted time.
To a large extent I agree with you, but there is one thing I pause about:
You get the same level of learning,
you get the same realizations, the
only thing you skip is your wasted time.
Here we diverge. As Confuciussaid:
Tell me, and I will forget.
Show me, and I may remember.
Involve me, and I will understand.
Sometimes, and for some things, that time spent working out bits of a solution - even if you fail and ultimately ask for help - is not wasted. Sometimes it's priming you to be in a better position to understand the solution you're given.
But do I really need or want to know, remember and understand the nuances of each and every of my problems?
For example, we have a lot of legacy Delphi code. Delphi 7 has a bug in which it gives incorrect compiler warnings for some of it. I don't care one bit about the history, details and nuances of the bug. The 2 hours I don't spend examining that are 2 hours I can spend learning something useful instead.
It's not yes or no. It's not everything or nothing.
* There are cases where the fastest thing to do is ask your colleagues.
* There are cases where the fastest thing to do is ask your friends (if you have any).
* There are cases where the fastest thing to do is ask Google.
* There are cases where the fastest thing to do is ask StackOverflow.
But there are times when it's best (and not necessarily fastest!) to work on it for a while to see if you can either solve it, or at least get your mind around it enough to understand the solution when it comes.
The very best programmers/engineers/employees/founders/people know when it's which case from the above.
Honestly, at this point it's about the asker's urge to learn -- if he blindly looks for an answer, then he won't take anything away from it. If he looks for reasons, then he'll get them.
This is true regardless of which method he'd use to figure out a solution.
I do agree it's not binary -- I'm learning Objective C right now, and spent two hours last night tracking down a crash that was ultimately linked to not understanding retain and release semantics. That is worthwhile, and a situation where just asking someone for a fix wouldn't work.
But I think that's a learning issue. If you already know the majority of what's going on, and the rest is just finding a key, then I think searching/asking is perfectly valid.
And really, wouldn't you argue that a programmer worth being called such would always attempt to be involved with finding the answer?
This workflow is efficient for the programmer, but not for the co-workers or the company. When you go ask a co-worker, you break their flow, which can cost them 15 minutes of productive work while they get their flow back.
If you can figure it out in under 15 minutes, you've saved time overall versus asking the co-worker.
The good news is that by merely attempting to phrase a question, people often solve their own problem. So, when a coworker bugs you, just look at them without processing anything they say. If they finish talking and don't have an have an 'aha' look about them after a few moments, only then do you actually switch mental gears, ask them to repeat the question, and go on from there.
I love being able to answer peoples' questions, and I hate asking them. I guess it comes down to I like helping, but I don't like feeling like I am being a burden. My process is like this.
1) 15 minute gamble on self solving intuition
2) Exhaust any possible solution I can think of even if I have to "be the computer".
3) Google
4) Documentation
5) Ask a co-worker
Sometimes I'll skip from step 1 to 5 if it is dealing with something that I rarely use. Typically this means I don't expect to remember the problem or solution later because of how rarely I visit this part of the application.
This is probably not the best way to do it, but I just remember things more often when I solve the problem myself. After 3-6 months with a new technology, I am frequently able to solve problems in step one.
when you _might_ get an answer in 30 seconds otherwise
Not arguing that this can't be an efficient workflow... but I think you pointed why it can fail and fail often. What if you don't find what you are looking for on Google and end up down other roads or dead ends that don't provide the real answer? In those cases 30 seconds can turn into 30 minutes pretty quick.
It amazes me that people would put coworkers second. Those people can be very annoying because I feel like their only purpose is to leech knowledge rather than do any real work. OP's list is the lazy programmer's list. Taking breaks to think about the problem is good, my order of operations is something like:
1. Google
2. RTFM
3. Think
4. StackOverflow
5. Coworkers/IRC
Even going to IRC can be dangerous, was told to read the f-ing kernel source when trying to ask questions about the darwin kernel API documentation once.
I like that order. Don't waste your time or anyone else's if it's a simple problem that can be solved with a direct Google search. But definitely think before asking.
I go to coworkers when I think it's a problem they've dealt with before. Otherwise, it's much easier to just Google it.
I would put 'Think' first on my list though because I really enjoy it, and tend to do it whenever I can. Google comes in when I hit a dead end thinking.
Google and StackOverflow are kinda the same step. I don't think I've ever gone to search specifically on StackOverflow, but google finds the answer there quite often.
I think this is a natural extension of the work programmers do these days. We don't spend a lot of time trying to figure out a better compression algorithm, but we sure spend a lot of time trying to figure out why some third party tool is throwing an error after upgrading some other third party tool.
I'm not so sure about "Google and StackOverflow are kinda the same step". In my experience, Google sometimes points to StackOverflow, sometimes to a copycat (really annoying), and sometimes there is no good result.
I've had better results on average by searching StackOverflow first, and then Google after if there is nothing on StackOverflow.
I think he means "post a new question on StackOverflow" not "search for an existing answer on StackOverflow" -- since, agreed, that'd be pretty much the same thing as step 1.
(I, too, do a lot of "site:stackoverflow.com" searches on Google these days btw.)
Yes. I have different workflows for stuff like, "Is this a known bug?" vs. "how should I model my domain?"
For the former, why dive in and learn something that someone else has already figured out, especially when the "something" is so mundane as an API incompatability? I would much rather spend my time figuring out interesting stuff.
I thought the exact same thing, since it never occurred to me that anyone would actually ask a question on SO and wait for an answer from it.
When doing niche development, small mailing lists provide an invaluable asset for these sorts of questions. Oddly, seems strange to ask on such a generalist site as SO.
Really depends if your surrounded by coworkers who are amazing at what they do or you feel way above your team and assume it's safe just to go to Google and get the answer rather than whatever a coworker comes up with or thinks is the right way of doing things.
The problem with "solving" problems this way is that bad feedback loops form: people who are only slightly better-informed than complete newbies repeat questionable advice they don't completely understand, crowding out better answers.
"You could think of it as putting a low-pass filter on some of the good ideas from the ’60s and ’70s, as computing spread out much, much faster than educating unsophisticated people can happen. In the last 25 years or so, we actually got something like a pop culture, similar to what happened when television came on the scene and some of its inventors thought it would be a way of getting Shakespeare to the masses. But they forgot that you have to be more sophisticated and have more perspective to understand Shakespeare." - "A Conversation with Alan Kay", http://queue.acm.org/detail.cfm?id=1039523
The problem is that researching a problem this way is often pretty half-assed; fixing a deeper problem by googling can be like copy-and-paste programming, rather than solving the actual problem.
I really try not to bother coworkers unless I'm totally stuck. They're all busy working on their own projects, and taking them out of the zone to help me doesn't seem fair, especially if they don't know the answer either because then I interrupted them for nothing.
The best way to ask a coworker for help: Look for a moment when he or she is not in flow that you will break. Returning from the water closet or coffee maker, or just if you happen to glance at their screen and see Gmail or HN or something.
(Yes, a programmer can be in flow while doing those activities, but the incidence rate is lower.)
> 7a. Write a blog post about the solution or submit a patch
I do this, too, and I think it's very useful, especially if the solution contains esoteric steps that can only be found in the deep archives of mailing lists.
I wonder if it would be possible to write a chat bot that gets the StackOverflow crowd to code for it. It would keep asking questions and nagging for code examples.
"Read the source code" should be on the list (if you have access to the code in question).
Among other things, this empowers you to fix problems in the code you are using, rather than just work around them in your own code. Reading the code is the first step toward contributing.
Reading unfamiliar code may be hard at first, but each time you do it, you understand the system better. Eventually you may know the third-party code as well as your own code.
Mine is something like this (Where my goal is to get the answer as fast as I can) :
1. Think quickly
2. Search google the fastest possible way (Even if keywords are pretty bad)
3. Search google with the best possible keywords I know
4. With help of results from 3 (In forum/etc.), Research google with new keywords that will improve results
5. Do step 3-4 until I see I can't improve anymore
6. Go directly talking to the best who will know about it. (Which is usually IRC or GitHub issues, etc.)
For most non-trivial problems, I spend times in 1-5. But for lots of problem (like configuring stuff in Linux), I spend lots of time in 2-5. For really rare stuff, I would go up to 6 (Which usually means I found a bug in the library and I'd send a patch).
I'm a bit ashamed by this.. but, I think I spend too much time in 3-5.. after a couple minutes, I think I should just RTFM and figure it out.. but I kind of become crazy and just search search search search until I get the answer I want. Only then, when I have a 90% correct solution, will I read the manual to extrapolate on this. But hey, that's my way.. :)
- off course Google is first; it is cheapest. Back in the day, its equivalent would be a visit to the library. That would come after ask a colleague, visiting one's bookshelf and thinking.
- for some classes of problems, such as algorithm selection, 'Google' requires quite some thinking about what your problem actually is.
- for others, such as figuring out the cause of weird error messages, Google may be about the only option, even though it isn't particularly good (e.g. because your query gives a zillion 'me too' posts plus a couple of five year old 'I did x, and it went away', where there is no reason to expect x to have any effect on the problem, where x seems to be pure overkill (reinstall, reformat), or where the poster readily admits 'it went away for a while'.
- typically, this isn't an either/or proposition. Googling, in particular, does not (have to) rule out thinking.
An important distinction here is that this is specifically a programmer's problem solving sequence. It's not directed at "entrepreneurs," "UI designers," "Information architects," or "Project Managers."
But in many situations, the "programmer" is wearing many hats at once. And in that case, much of the "thinking" or other due diligence that a programmer should be expected to do (according to John, I think reasonably) may have been accomplished before this checklist is taken up by a programmer.
There are still many programming jobs which revolve solely around programming and programming alone, but even in those cases, I think that John's "Think" step would be given more than just a passing glance early in the process.
I'm impressed how up the list "google" is and down/middle the list "think" is. How are you supposed to construct the query/question supposed to return results relevant to your problem, let alone recognize you found something relevant if you did not think about it beforehand? The most important part in finding a solution to a problem is actually asking the right question, and that requires quite some thought.
I'll never actively engage community via stackoverflow or irc, I'll only check for existing questions and answers since I don't have time to actually wait for responses.
Occasionally, I'll bring Think to the head of the stack is if the problem sounds fun--or seems like I would enjoy the challenge of solving it.
While you can ask a good question or find good keyword for google, I think it be ok to use google or asking at SO, anyway. You need to think what is the best way to express your issue, and if you succeed, you are already 90% solving that. And if you use google, you don't have to bother others so many times...
Short answer: Yes, I think it should be this way, but with caveats.
Balance is the key. Taken to an extreme, the thinking approach can kill a project. After all, when it comes to computing, we are all standing on the shoulders of giants. The position that we should always solve our own problems by "thinking" suffers from irreducible complexity. Why not implement our own language? Brush off those compiler skills. See you in 5 years when you have the beginnings of a mature language. Meanwhile, your competitor, who used an existing language, will be 5 years ahead of you on their project. The same applies to "Googling" answers, which is just a metaphor for looking for prior work. If I find a solution to a complex problem in 2 hrs of Googling and reading, while my competitor hammers out their own solution, there's a good chance I'll gain a lead on them. There's also a good chance that my solution will be more flexible, leading me to continue development while my competitor is still extending their solution.
As usual, "it depends". What are the priorities at the time? Is the team under a deadline (ha!)? Are we solving a problem that is considered central to our solution? In other words, would we gain a competitive advantage by building a better mouse trap? Do our programmers have the experience and talent to build said mouse trap? Few companies have the resources to hire people focused enough to solve difficult CS problems, so scouring the internet for leads on the best solution is never a bad idea, IMO. This applies even if a solution immediately comes to mind. At least "check your math". Maybe you'll find something you didn't think of. If you've got Facebook/Google money, well then throw this advice out the window. Go hire a six-figure PhD in your specific domain and make history.
When faced with a difficult problem, the "think through the problem" method often requires the most time, and there is no guarantee that you'll arrive at the most efficient solution. Depending upon what you consider difficult, there may be exceptions to this rule, but if you are the kind of programmer that needs to Google solutions to trivial problems, you've got much bigger challenges ahead.
For most competent programmers, Googling usually means looking for a library that accomplishes a task, or trying to locate the most efficient approach to implementing a non-trivial task. In these situations, Googling to locate an answer has the added benefit of context. It's rare that you find a solution in a vacuum. There is usually some discussion, so you're benefiting from the contribution of many people. Few companies have the resources to hire a large team of developers who specialize in all the important areas for a given project. Normally, you end up with a team -- sometimes a team of one -- of generalists who must look for solutions to specific problems that falls outside their area of specialty. In this case, Googling solutions makes a lot of sense.
I want to follow this up by saying that I have tremendous appreciation for academics in software development and purer forms of CS in general. I encourage programmers I work with to expand their skills and "think" about problems. It is unacceptable in our organization to simply copy/paste a solution. Before selecting a library, we always google "[libname] bug|issue|slow" and look through the results. Whenever time permits, we pick a library and dig in. In short, I expect my team to grok our solutions, not simply plug them in and run.
Usually if I get to 3 then it means I'm going against the grain, trying to do something that just isn't meant to be done that way. Recognizing that point is an important life skill. :)
By professional attitude, I mean thet the programmer in question gets a good understanding of the problem and the solution from his solution-source of choice.
If the programmer can't acceptable understand the issue at step N, he will move to step N+1.
If Quora or SO doesn't yield enough understanding for a given problem, that's hardly an issue. Go to N+1.
(At any rate: I'm not familiar with Quora, but SO answers often have good explanations and links to official documentation and well-written instruction material.)
I find that what's out there on google tends to catch edge cases that my cursory bit of thought leaves out - especially when I take the union of several results.
1. Google. 2. The only useful result is a Google cache with a pastebin with a stack trace similar to mine. 3. Examine the pastebin stack trace. 4. Find an embedded userid. 5. Google userid, find github account. 6. Msg user via github. 7. Get response, user doesn't remember solution but remembers they got it from IRC. 8. Search IRC logs. 9. Find response with a link to a commit. 10. Apply the change locally. 11. Profit!