This question has been inspired by my recent discovery/adoption of distributed version control. I started using it (mercurial) just because I liked the idea of still being able to make commits at times when I couldn't connect to the central server. I never expected it would give me a large boost in general productivity, but a pleasant side effect I discovered was that making a new clone every time I started a new task and giving that clone a descriptive folder name is extremely effective at keeping me on task resulting is a noticeable productivity increase.
So as a programmer what single discovery has given you the greatest boost in productivity?
Extra respect for answers which involve tools or practices that aren't so obvious from the outside!
Not sure it's really my #1 but nobody has mentioned this yet: syntax highlighting.
Maybe it's just because I've gotten too used to it but it takes me twice as long to edit a program in nano (black-and-white) as it does in KWrite (color with syntax highlighting)... sometimes I've been outright unable to do it.
For me it is Code Completion (which Microsoft calls Intellisense [1] although they are slightly different). Things just move so much faster when the information I need right now is right at my fingertips. The savings in keystrokes helps as well.
[1] http://en.wikipedia.org/wiki/IntelliSenseContains search--not just BeginsWith...which is awesome - Michael Haren
man -- prevents you from overlooking side effects... but then I program in C... But when in Java, Eclipse's auto completion rocks! (I will write an emacs extension to find and kill anyone who calls autocompletion "intellisense") - Aviral Dasgupta
Flow. Try to maximize the amount of time that you can spend in Flow. That means: Close your web browser (the one opened to cnn.com), don't listen to distracting music, close your mailbox, close your IM, etc. You get the idea. If you wanted to be very productive in college, you shut out the entire world so that you can focus. There's no reason why work-life is any different.
People who are least productive tend to lose a lot of time to distraction, entertainment, etc. Look at your co-workers. You'll see that I'm right.
VIM!!! Nuff said!
vim. No fancy exclamation marks needed or allowed. - mctylr
<ESC>bb... whenever I misspell something and then I mess it up even further. - community_owned
vim magic. My productivity is 500% compared to other tools used for 'software development' ... I get impatient watching my colleagues to click or highlight stuff with mouse, copy paste, compile and then search for the window with the error output, try to find stuff in file, most 'editors' don't recognize that file has been updated and so on ... vim has it all plus some ... I'm using it on all platforms (mac,linux,windows) ... and it does not freeze while updating intelisense - stefanB
Dual Monitors for me. Note: I haven't attempted to use one very large screen.
Surprised no one has posted the obvious smart-ass answer: caffeine!
Debuggers. I remember that learning to use debuggers opened up a whole new world for me.
Programming languages with managed memory. It makes coding so very much easier. Also an IDE that has code completion is a must.
pencil and a paper (simple obvious) but still underestimated
Learn another language. Eg, learning Ruby, and Ruby on Rails, has helped my Asp.Net programming immensely.
Open source.
Nothing even remotely compares to that in terms of productivity boost. You could take away intellisense, or even the IDE, and pair programming would still be more productive.
A decent pair of sound isolating headphones [1]. It still surprises how much more I get done when I block out all the office chatter. It's not a private office [2] but it's a start.
[1] http://www.google.com/search?q=shure+se110Lisp. (Why write programs when you can write programs to write programs?)
I'm surprised nobody mentioned this - perhaps nobody knows this? Well, I hope my answer will enlighten everyone...
My discovery that boosted my productivity the most was this:
You don't have to read 20+ blogs, before you can look into that critical bug, that your boss wants you to fix ASAP! You don't even have to read a single post! It is possible to start working on it without reading anything at all!
I know, I know... Sounds crazy, but it's true!
Getting up and walking around, especially in the fresh air, really makes me a much more productive problem-solver. This is when I usually come up with the "Eureka!" solution.
That it's important to understand, deep down, how your tools work, and how you can use them to improve your workflow and automate repetitve tasks. Regardless of whether you use Eclipse, Textmate, Visual Studio, Vim, Emacs, Notepad or anything else, take the time to learn their shortcuts and, better, understand how to extend them with custom plugins.
Even further, learn shell scripting if on Unix (or PowerShell on Windows). Repetitive tasks can and should be automated, and pain points can be blunted. Automate your deployments. Automate your builds.
Source Control
The day I started using source control for all of my personal projects was the day I graduated from amateur to professional. I can't believe I wasted all of middle school, high school, and two years of college agonizingly writing code without being safe in the knowledge that a known good version was saved away, ready to be reverted to if necessary.
Oh, and don't even think of trying to do a group project without source control.
Generics. Casting is for pottery.
Descriptive variable naming
It's not very hard to do, just rename "size" to "imageSize". And don't abbreviate too much. "op_add" should be "operator_add". I still use "i" in loops, but only when they're small, and never in nested loops.
This makes it way easier to come back to projects you haven't touched in a month. :D
Tab Completion!
To be honest, some of the other answers are nice, but can't always be applied in every situation, especially day-to-day tasks which we perform hundreds of times.
I find tab completion helpful not only because it prevents spelling mistakes, but allows me to save time, every single time I go to the terminal.
Only one answer? I'm going to cheat a little, since my three answers are very closely related. ReSharper, Refactoring, and Test-Driven Development.
Lambda Calculus [1] and Object Oriented Programming
or more generally speaking... truly understands what "functions as first class objects" means...
and not everyone really groks how OOP works. Evidences are those large switch statements and if-else spreading out through a large code base that could be eradicated with application of polymorphism.
[1] http://en.wikipedia.org/wiki/Lambda%5Fcalculusif/else and switch has its uses and then KISS but I meant the ugly ones! ... - chakrit
Don’t know this has been posted or if it would make the cut for a discovery.
For me it’s Peer Review [1].
Working with smart programmers, getting that extra pair of eyes to look into code. Saved me from burning the Midnight oil many a times!
[1] http://en.wikipedia.org/wiki/Peer%5FreviewI'm surprised no one's mentioned this one: Python!! Before Python, I used to use C/C++/Java for most things or occasionally PHP/Javascript (depending on what I wanted to do).
Now, my first step is almost always to prototype the core logic in Python. Having an interactive interpreter, sequences, iterators and strings built into the language (yes, I know C++ and Java have them too, but they aren't quite as easy to use), having a for-each construct, and a billion other things make coding in Python like writing executable pseudo-code.
And the richness of the third-party libraries is amazing! Want to write a parser? pyparsing is your friend (I wrote an adequate chemical reaction balancer/parser in an hour). Want to manipulate images, use PIL! Bioinformatics? Biopython.
Closing the browser often.
Learning to break down complex problems into a series of simple tasks boosts productivity and improves the accuracy of your schedule.
I've been around a while so I have several single things over the years and they vary wildly. I really haven't had any productivity discoveries in a while, except for small special purpose tools.
Probably my biggest single discovery is to prototype quickly and get the user/customer looking and touching as fast as possible before wasting time on features that they don't want or will change as soon as they discover that they really don't want it that way. I first realized this the first time I used Visual Basic to prototype the interface of an application I was creating in C++ (late 1992/early 1993).
A bunch of people can sit around a table and discuss for months what they do and do not want, but until they can actually touch it and experience it they really do not know.
The Internet/WWW! There is often a solution for so much problems. If you want to squeeze knowledge out somewhere or just talk with other IT-People, the www is THE place.
The Libraries for every programming language in the www! I can't live without the Apache Commons, Hibernate, Spring and so on. They make my life so much easier!
High-Level Dialects and Domain Specific Languages [1], to use the found libraries. Such DSLs [2] can be written in Groovy, JRuby or LISP(Closure) for example. Grails [3] as Groovy [4] DSL for Web (with addons...) has boostet the overall productivity many projects a lot! It's an impressive framework!
Getting a good nights sleep is pretty underrated.
Formal design patterns and unit testing.
We finally retired a legacy VB6 codebase and are in the process of building new frameworks for our business model and there's really no comparison. We're infinitely more productive. (well maybe not infinite, but you get the idea.)
whiteboard
Test Driven Development. I was skeptical, but it works remarkably well. I was able to code a chess rules engine (validates all legal moves) in about 40 hours, with only one defect. I have been programming for almost 30 years and TDD has given me the biggest boost in productivity.
Templates!
I'll spare you the nasty details, but I've written classes before with seperate (overloaded) functions to do exactly the same thing with a different varible type.
STL
In my undergrad studies I was hardly aware of it and every time I needed a data structure I had to pull my own. luckily on my first real job they showed me the light that is STL.
That it is OK to say no to unproductive work.
Stack Overflow [1], obviously.
[1] http://programmers.stackexchange.com/questions/30513/as-a-programmer-what-single-discovery-has-given-you-the-greatest-boost-in-product/30618#30618rotating my monitor 90 degrees. the contents of the display are my brains level one cache, and its measured in (cache) lines from top to bottom so rotating the display greatly increased the lines of code I can see at once.
Working on a fun project.
That's the single biggest productivity boost for me.
LINQ. I love not having to write the plumbing for iterating over collections over and over again. Also being able to apply set operations to collections of data is a huge productivity boost.
Learning to type properly and accurately.
Stack Overflow! No, wait, you said "boost". Hm.
Gnu screen. I work primarily from the command line (Ruby/Python/PHP) and it has been, bar none, the single greatest tool in my toolbox for increasing productivity.
ASK!
You don't always have to spend hours alone trying to figure out how to do something. Often it is better to email a friend, call someone or post the question on stack overflow.
It's a tie between Ctrl+F and Ctrl+C
"Thinking" in a functional language (in my case Scheme).
Since I started using a programming framework ,My productivity has increased 10 folds ,Now I dont have to do much work to get what has already been done.
Synergy [1] helps me save a lot of time changing keyboard / mouse when coding on heterogeneous platforms (like Windows and Linux). It basically lets one computer share its HID with another... or a set of others... And it's a life-saver.
[1] http://synergy2.sourceforge.net/ctrl+r in bash terminal (and other bash terminal shortcuts)
The realization that keyboard > mouse
It started with launchy.
After a while, I learned vim.
Then, I starting using the command line.
Then I switched to linux.
Then I started writing scripts that automate the mundane tasks that I always need to perform.
A good 8 hours of sleep every night. Amazingly, this increased my gpa in college by .5 and makes me incredibly more productive during the day. When I am sleep deprived I cannot concentrate on anything.
If you're doing your own projects as opposed to your employers, taking your own ideas to reality, you are a heck of a lot more motivated and productive than when doing a 9/5. Your project is the first thing you think of when you wake up, and its the last thing you dream of when you fall asleep at the keyboard, waiting for the sun to rise so you can do the same thing again.
Due to the types of projects I've recently been working on, OS Virtualisation technologies (Virtual Server 2005) have probably boosted my productivity as a developer by quite a large degree. This is because I can get new development environments for different types of projects (which require 2 to 4 machines to represent a cut down instance of the final production environment) up and running really quickly. To paraphrase from another question [1] I answered about ' How to quickly setup a developer machine? [2]':
[1] http://stackoverflow.com/questions/645218/how-to-quickly-setup-a-developer-machineI have a couple of different base development environment configurations hosted on virtual machines (Virtual Server 2005). Once I was happy with them I sysprep'd them. Now when I need an environment for a specific project type I clone the VM with the config I require, start it up and and off I go to work. The great thing is that if I wreck the VM all I need to do is start afresh from one of the sysprep images. It's such a timesaver.
Recursive function call.
I'm sure I'll get flak for this, but I mostly use C++, and the boost libraries give a big productive boost.
I think this change pretty much the way I see code.
Before everytime I need something else I just added and if the previous design didn't match I start doing strange things and after a couple of weeks, everything was a real mess. Going like that every time I need a new feature, the existing code was somehow in the middle.
After getting to know refactoring, everything was much easier, new functionality helped to define the methods, and the design. I extracted methods, simplify conditions and a lot of etc. which make my existing code much easier to work with.
Notepad++. Hands Down.
I discovered that is nonsense to pretend to create something perfect the first time. You have to understand your problem, so it makes sense to grow together with your product.
Whiteboards.
All the fancy tools in the world cannot replace a full-wall whiteboard and a couple of co-workers.
Exercise- as powerful as caffein with no deleterious, and many positive side-effects. A simple 45 minute jog every other day does the trick for me. Often I find the answer to a difficult problem in the shower after a run, especially if I am well rested.
My answer: the promise of dual monitors boosting performance while programming/debugging was a lie.
I now prefer 1 monitor. With two monitors you always have too many things distracting you and also you get stressed due to awkward head and eye movements.
I'll never go back to 2 monitors.
(I also use EMACS so I keep my fingers on the QWERTY row much more than ever before... why stop the flow of typing??)
for me, Linq
The world wide web. I used to spend HOURS every week thumbing through books, going through the MSDN disks, asking other folks etc, looking for answers to questions. The WWW put the answers quite literally at my fingertips. Of course some of those answers are wrong, but even when you factor in the time for filtering out the wrong ones, it's still a lot less than I used to spend in the library alone.
Not checking my email in the morning, and turning off all the associated alerts and popups and warnings and so on.
Enabling the "Hide When Minimized" option in Microsoft Outlook.
Higher Order Programming. (And on some days: unplugging the phone...)
Definitely MVC. As a amateur-turned-professional web developer with a background mostly in PHP I always found it a bit difficult to wrap my head around the idea (PHP naturally doubles as a template engine after all). While I was familiar with templates, I never thought of it as a step towards MVC, which I always associated with Microsoft's .NET stack.
Even when I learned about Java Servlets and I tried having beans for everything and putting all my output in JSP files I never quite "got" it. Beans seemed cumbersome and without ORM (which I always thought to be a fancy way of writing queries without using SQL) I often found myself dealing with SQL in beans and servlets alike.
When I picked up Python and came across Django, it suddenly all fell into place. Sure, Django calls it MTV and the views are really more like controllers, but without ever having been exposed to the architecture directly before, it just all made sense.
I'd say it even gave me a better understanding of OOP. Even though I still loathe PHP frameworks and PHP in general, when I came back to PHP recently for a client, I naturally structured my software the way Django taught me: my ORM classes separate from my views, my views separate from the templates and all that separate from the main file, which now just served as a dispatcher.
Not only that, I think it even gave me a better understanding of software architecture in general. For example, I now understand better why it is a good idea to keep your GUI code out of your business logic in desktop applications. In fact, I don't even think about it much anymore, it just seems obvious to me now.
tl;dr Learning MVC gave me better insight into OOP and software architecture even in languages I otherwise find messy to code in.
Visual Studio - the fuck***g best IDE in the world!
since its still a pain in the ass its just the best one gets! the editor is cool / debugger is as one needs it + you get edit & continue which is very nice. Customizable as hell + good plugin interface + good external buildtool integration like cuda- or other microprocessor-compilers - and its a fast IDE - not like other java-written IDEs.
i tried many IDEs and did also larger projects with for example eclipse or netbeans - but they all cannot reach the quality of VS.
I hope MS will forget about their company politics someday and support cross platforming better in the future. But this is quite unlikely to happen.
Losing my girlfriend. Not that I was really thinking how much more productive I would be, but it is a side effect.
Hot showers.
Usually there I get my "Aaahhh, of course"-moment.
The idea that computer source code is just an a kind of data you can compute with. This means you can build code analyzers, transformers, generators, ... that reuse your knowledge about code rather than doing all the coding yourself.
The key idea is program transformations [1], which allow you to code bits of analysis or transformation knowledge as rules you can store and apply many times. This generalizes all the "code generation", "metaprogramming" and "aspect-oriented programming" stuff you hear about.
[1] http://www.semdesigns.com/Products/DMS/ProgramTransformation.htmlObject-oriented programming. Nuff said.
Know thyself!
I've discovered that to truly be productive you have to listen to your biorhythms. My most productive time of day is in the early morning hours between 4am and about 9am.
I can often accomplish more in 10 minutes in that section of my day than I can do in 2 hours at any other time. (Grunt-work excluded of course :) ). So I do most of my planning/thinking at that time.
I know you said "ONE THING", but... The other thing is to use your subconscious mind to figure out the solution to any major problems - it will do a way better job than your conscious mind can!
Former programmer. Best discovery that I ever made was to hire people that knew a hell of a lot more than I did and were more up to date.
Never failed me yet.
Realizing that time spent designing is better than inversely proportional to time spent coding.
Emacs [1] along with the whole new world of Free Software [2] tools.
[1] http://www.gnu.org/software/emacs/That I can code after GF goes to bed.
Python.
Coming from a C/C++ background, it takes so much less time for me to do what I need in python.
I +1ed intellisense and syntax highlighting. But since noone has mentioned it, object oriented techniques, in particular Design by Contract, have done a lot for the quality of my code, hence improving my productivity.
switching from pc to mac helped my productivity the most because I started enjoying spending more time at the computer.
One thing that's been the greatest boost in productivity?
C#
Diagnosis
The only way you can solve a problem is to be able to diagnose what is going on, and not just bandaid the symptom.
A while ago i read a book on just diagnosis, it wasnt related to computing , but on diagnosising any problem, it really helped develope my deductive reasoning skills.
A 4'x6' whiteboard. Ok, any size will do but the bigger, the better.
Take time to RTFM for your frameworks, programing languages and other tools before you use them. Read most of it, you don't have to memorize everything. You want an idea of what the tool can do for you, so you don't go reinventing the wheel.
Control+Space. 'nuff said. In-line documentation for functions and classes, autocompletion, type matching.... I can barely program without it.
Definitely the mini-fridge under the desk. Although more frequent bathroom trips may be offsetting the convenience.
File Sharing.
I've gained the equivalent of a Master's degree in my field by torrenting software applications and textbooks and studying for free at home. I learned more (in far-less time) than the tools spending $50,000 to listen to a disgruntled professor recite a textbook that cost said tool about $80.
File Sharing.
Working at night!!
Two answers:
Write an application for someone else, then maintain it as they ask for things which weren't even considered in v1.0. This helps with better design so you don't have to spend so much time re-factoring. Also, having an IDE which can do a lot of the re-factoring for you (e.g. Netbeans) is nice to take care of things quickly.
My single most productive move was to get rid entirely of the debugger.
Don't get me wrong: I've start in 2nd generation language (manually entering hex codes, not even assembly yet) and I've spent more time in more debuggers than most programmers on this site.
But since unit testing and multi-threading (you know, the present) came around me I realized that the old "debugger" concept was such a waste of time when working with high-level languages.
Sure, I still use one when I'm doing the occasional C hackery but besides that, learning to "find problems" by thinking outside the box, on a higher level, and never using a debugger again was my single biggest productivity boost.
For me the most important but seemingly obvious lesson I've learned is in naming conventions for my objects and the ability to define through names the processes that are going on. Familiarity with a framework's object names is also very important.
Time pressure. Nothing makes me more productive than knowing I have to be done soon. I usually end up having my most effective code sessions when I am in a hurry. If that deadline is not real, even better, as that means I can still spend a bit more time reviewing what I did.
the discovery that imperfect solutions are the best ones.
I'd say my wife and Kids. Honestly, yes Google, MVC, this and that give a productivity boost, but it's incompatible to what my spouse / kids give by just being them.
But for those married dev's out there, or those with kids, there is no single entity that can give a productivity boost like your spouse / kids. Especially when you are the sole provider.
You want to increase someone's productivity, give them something to work for that's not themselves.
Disclaimer: I am not saying for employers to sign up all their single staff on eHarmony or anything else like that. Just sayin'.
in C# LINQ-to-[Everything] is extremely helpful especially coding in Lambada.
Dependency Injection/DI and the type of code it enforces (loose coupling, MVP, etc).
DI might have a steep learning curve (especially if you've programmed for a long time without DI), but once you get the hang of it, the code gets easier to test, refactor and read (by you, the author or someone that will "inherit" this code when you leave the company for Google, where they use DI and strongly recommend it [1]).
Recommended reading: Misko Hevery's blog [2] and the "Guide: Writing Testable Code" [3] it hosts.
Plus, it adds another one of those nice expressions that can easily be misinterpreted by a non-programmer person, like: "Have you injected the Client?" or "Wow, this Guice [4] makes work so much easier."
[1] http://misko.hevery.com/code-reviewers-guide/Particularly when programming in C or C++, liberal use of the assert macro has saved me countless hours of debugging.
For those of you who do not know, assert is a preprocessor macro takes a boolean expression as its argument. When executing the program, if the boolean expression is false, location information (source file and line number) is printed to standard error with an ``assertion failed'' message, and the program aborts. For a production release, the macro NDEBUG is defined, and the asserts are compiled out.
assert can be more useful than comments, as it is mechanically checked as the program runs. By making your assumptions about the program explicit in this way, when those assumptions are violated, you learn about it sooner rather than thousands of instructions later when your program segfaults far from where the actual error is.
This early detection complements the use of a debugger as well: rather than working backward from a segfault, you add enough assertions so that your program dies with an assertion failure. This helps narrow in on the bug.
assert exists in most languages, although I find it most useful in languages that use manual memory management.
Testing, plain and simple. I sort of had to be dragged to it, but now I'm addicted. And it turns out that it has some great features that will, over time, make you a better programmer.
First, you discover that if something is hard to test, it's a code smell. Doesn't mean it's wrong, but there's a good chance that when you're struggling to test all combinations of those five arguments to a function, you're doing too much in that function.
Second, "fear-driven development" is a thing of the past. Many times developers find themselves afraid to touch a hairy section of code because it's grown over time and has become unmaintainable. Having fear back you into a technical corner is never pleasant. With good test coverage, it's much easier and safer to dive in and make those changes. "Fear-driven development" goes away.
Third, your overall designs improve. As with the first point, not only do you discover that discrete bits of code become more maintainable, you find yourself wrapping global variables in well-guarded method calls to ensure that you can test them easier. Later, when something else break this "global", it becomes trivial to add logging to find out what does it. Further, you find that your code starts decomposing into different sections that are easier to test, but this also tends to be better-designed code.
Fourth, you'll be more productive. The studies I've read tend to show that initial productivity drops between 10% to 30% while testing, but long-term productivity increases because you have fewer bugs. When you implement a new feature, you can code as fast as you want, safe in the knowledge that a strong test suite will catch many errors. Also, when bugs do arise, good test suites generally help you pinpoint their source much faster.
Fifth, you can work as a team better with tests. When Joe and Sally both check in code which passes all tests, often the tests fail when the code is merged. This can be a very subtle issue when working on separate areas of the code. I confess that sometimes I hack together code quickly just to explore an idea, but when I'm working with others, I wouldn't dream of it. Tests will save me again and again.
Sixth, you know where bugs are before you find them. This sounds weird, but over the years, I've discovered that when I run test coverage code, those areas of my code which aren't tested are almost always those areas of my code where serious bugs/design flaws are working. It happens to me again and again. Look for areas where your test coverage falls short and you'll find bugs. Even if you don't see them, write tests for them and those bugs will start crawling out of the woodwork.
Testing is far and away the best tool I've found for making me a better programmer who turns out more code, to deadline, with fewer bugs.
Learning how to touch type. I had developed my own homebrew technique over the years, but still made a lot of mistakes when typing. I forced myself to spend an hour day with a couple of free typing programs and saw my accuracy soar. This made programming much easier as I didn't waste time hitting the wrong keys and could focus on what I was trying to code.
When I discovered I could tell the computer what to do, hit a button, and the computer would do what I told it to.
Getting rid of .h files in C#.
Expectations before taking a new job that it will be much better. For some first weeks/months I get a productivity boost until they dissappoint me again.
Cigarettes and coffee.
Head Phones, with appropriate music to block out the NOISE!
Lots of great stuff here I agree with: isolation, caffeine, unit-tests, flow, pencil & paper, good CASE [1] tools.
One I haven't seen that I find is critical to getting the job done (especially if you're stalling and don't want to do the work)
Todo Lists
Every day I start with a todo list (or I throw it together the night before so I can go home... hate breaking the flow like that, but balance is important too).
Once made, start working your way through it. Side benefit: If/when interruptions happen, todo list is right there to help get back in the zone.
Journal/Notes
Also, I find it helps to keep a text file/journal where I can throw anything/everything without thinking about it. Code snippets, urls to helpful articles, etc etc. Sometimes I just work through a problem by writing about it.
[1] http://en.wikipedia.org/wiki/Computer-aided_software_engineeringMatched parenthesis, bracket, angle bracket, and brace highlighting. When you do as much XML as I do, as well as as much Scheme as I once did, it's an incredible time-saver.
Many people stated the things that many of these tools do, but these are the best tools for the job for me. Textmate Bundles, CSSEdit, and Firebug take me about 95% of the way. Omnifocus and GTD for managing my projects.
Description of Bundles:
http://manual.macromates.com/en/bundles
Public Repository of Available Bundles: http://svn.textmate.org/trunk/
Also, for Design Work, CSSEdit:
And for JS Debugging, Firebug: http://getfirebug.com/
OmniFocus: http://www.omnigroup.com/products/omnifocus/
All well worth the money. About a combined $150, will pay for itself in a day.
For me, stack overflow is turning out to be a great boost.
Not to use internet at work.
SLIME [1]. No other editor, IDE or programming environment I've seen offers the same level of integration. Not only does the editor understand the syntax of the language, it communicates with your program while it's running. It knows the value of everything, at all times and, to reference the old saying about Lisp programmers - it knows the cost as well, due to the integrated profiler.
[1] http://common-lisp.net/project/slimefor me, regexes and design patterns.
asking a DBA for help with database design.
Two things:
Breevy [1], which I use to "autotype" boilerplate code using shortcuts/abbreviations.
My widescreen LCD monitor. Emacs with a horizontal split increases my productivity so much it's not even funny.
Stochastic unit testing. Don't just unit test: unit test with large-ish sets of random inputs. It'll catch errors you'd never think to test for on a fairly regular basis.
(In languages with accessable parse trees, there's a good argument for mutation testing, too - see the Ruby took "heckle" for a good example.)
Valgrind [1].
If you are using an older version, it is definitely worth upgrading for the --track-origins feature.
Humanized Enso
I wouldn't say it is "the" greatest thing for programmers specifically, but it definately saves me time from fumbling through directory hierarchies and windows all day when someone interrupts my programming time to ask a question.
Syntax Highlighting, Auto-completion, Source Control and ORM.
Streaming/satellite radio.
Practice and self analysis of your problem solving techniques.
I find I only really understand something once I've done it a few times, and I feel that programming is no different. I've heard programming described as an art form and I agree. It takes years to master.
At the moment I am working on User Interfaces and find myself trying out new ideas and new approaches in my spare time just to see what works better. This has lead to substantial improvements in my work rate and more importantly less re-writes because of bad design.
Software: Quicksilver [1]. Nuff said.
Hardware: A wireless mouse (no more losing "flow" at critical moments when the cord get tangled)
Time management: The Pomodoro technique [2]. In a nutshell, work for 25 minutes, take a 5 minute break. But there's more to it. Mix this with a solid GTD workflow and it's amazing how much quality work I get done these days.
Diet: I've never been unhealthy or overweight, but eating like a bear (nuts, berries and fish) really seems to help me concentrate better and solve problems much quicker. I'm never going back to pic-a-nic baskets.
[1] http://www.blacktree.com/Ruby. Incredible productivity increase coming from both Java and C#. Dynamic typing, blocks, and easy-to-read syntax come to mind.
Ctrl+Click and Alt+Left/Right in Eclipse.
Edit: and how could I forget Ctrl+Alt+h when the cursor is in a function name.
Lately, I've gotten a productivity boost with one simple tool: good posture.
Forcing myself to sit with better posture makes it much easier for me to stay on task, for some reason. Whether the improvement will remain robust to time remains to be seen.
These are varied and largely unrelated, but here's my list from the last few years:
Taking notes / record keeping
I'm the "go to guy" for my current project, and the project is a pretty large one. This has two implications:
In short, there's more going on than I can possibly keep in my head, especially long term, so I have to augment my memory.
Git
Branching and merging couldn't get any easier. And that's just scratching the surface. git stash and git add --interactive are both extremely handy as well. And being able to trivially get your patches to your favorite open source project merged to master (trunk) on github is a pretty mindblowing experience as well.
Profiling
KCacheGrind is awesome. Why waste your time guessing what's slow, when you can get hard data?
Unit Testing
For any piece of code with a large number of test cases, unit testing is the only sane way to ensure that fixing one test case doesn't break the others. Being able to trivially verify all test cases 6 months later is also a must-have.
Memcached/APC/nginx/varnish
If you're using a pure LAMP stack (apache, mysql, php), you're missing out.
The discovery that, in the real world, workflows are often constrained enough that it isn't necessary to handle all cases - and much of software requires solving "engineering problems" rather than "computer science problems."
Valgrind.
Because "Segmentation fault" is ever such a helpful error message.
Outsourcing to third world countries
Bpython is awesome in python, an interactive shell is fantastic when learning a language or framework.
Moore's law for caffeine.
intellisense
Writing cleaner code by using god text editors like vim, kate etc. I leanred a lot about standard coding when I checked their options.
Using an IDE as opposed to a simple programmers' editor.
The greatest boost to my productivity has been from learning how to recognize that I'm starting to write some code or text that is very similar to some code or text I've already previously written in the file or the project, and to quickly generalize and create a function, include file, macro, or other appropriate idiom that makes what would have been messy, elegant.
Resharper, it's probably already been said.
If i were to choose only one thing that boosted my productivity it would be a moment when I've put down books and learning-only mode to programming and doing stuff instead of only reading about them.
Realizing the fundamentals of HTTP and Web and how they actually work while working on classic ASP has turned out to be my greatest discovery. I could then think in HTTP and design my own CGI applications on plain HTTP state-less protocol.
This findamental understanding is still helping me learn new web-technologies much faster.
I'm still amazed for what all things we were forced to do in classic ASP which now in ASP.Net is just readily available. Databinding, paging, server-controls and server-side events.
In all honesty, probably learning another programming language has helped me the most. Once you have taken a look at one ore more other languages, you find patterns in the code. It helps you better understand how to reach your objectives and will make you a more efficient programmer.
Code completion.
The USENET!
Yes, little children, there was a time when your compiler/tool/SO/library would spit a cryptic error message and you had no option but read the thick manual. After being stuck for days, you would just reimplement everything in a different way.
Then there was the USENET. You would ask a question and the greatest specialists in the world would answer you. Then there was Dejanews. You'd find similar questions already asked. Now you just put your error in Google and you solve your problem.
Stackoverflow.com, 'enuf said
COPY & PASTE shortcuts. This is the foundation of my career.
Creating mock versions of critical backend services. It has enabled our team to develop the front-end virtually separately from the back-end.
Modafinil, a.k.a Provigil. It's the next Caffeine, and the worst kept secret of the working world. Although it's hard to measure, this item is possibly the most prescribed off-label Rx in the United States. If Obama directed the FDA to permit over the counter sales, we'd be out of this recession by Christmas.
From time to time: using the other hand to use the mouse :)
It's quite refreshing feeling, it forces you to use keyboard more often and it might increase your creativity (there was such study).
The discovery of www.stackoverflow.com existence and the way how it works. Nothing is comparable!
Meta-programming. I know someone mentioned Lisp but that's just one tool that supports the technique, there's much more:
The reason this has boosted my productivity is because it allowed me to adopt a wildly different perspective on both designing and maintaining software.
Automatic code indentation and following a code convention always helps me spot small problems before the compiler.
Discovering how bad I am at programming -- after a job search where I got a terrible test.
For me (now), knowing how much you are bad, as a human being, because your memory is terrible, your logic is flawed, your attention is bad, is the best skill for a programmer. It allows him to code according to his flaws and make the code point him his errors fast. It also gives you a chance to learn from everything around, by not assuming you "know".
Those answers somewhat reflect my feeling : http://stackoverflow.com/questions/242293/are-you-a-good-or-bad-programmer
This article totally refflect my feeling : http://subwindow.com/articles/2
After the test that made me admit how bad I was, I relearned everything from the start, the languages, the computer theory, helped by search habits from a self-made background.
Databases - as a newbie programmer the hardest pieces were writing and reading data to disk in an organized way, then later it was sorting information, then it was finding information, then it was network-accessibility of information, then it was concurrency concerns, and security concerns.... DBs provide for every one of those needs!
Stack Overflow really helped to resolve many of the Critical Issue which were quite difficult to search on Google also.
Thanks for giving such a helpful site.
I've had a Logitech MX Revolution for a while. Today, I assigned copy, delete, and paste to the secondary mouse wheel. Now, I can use my mouse thumb to do all of those operations!
Mathematica taught me the value of a really high-level language but it took OCaml [1] to make that style efficient enough to let me replace C++. Now I use F# [2] for its multicore support and nothing else comes close.
[1] http://www.ffconsultancy.com/products/ocaml_for_scientists/To Do List ... Keeping a Diary for it.
hate to be a brown-noser but:
STACKOVERFLOW.COM.
just look at this FB post: (it may not last long)
http://www.facebook.com/ramy.abdelazim/posts/160787040626203
A GNU screen session inside another GNU screen session. It blew my mind when I first accidentally did this.
It may be some small small productivity say: the production tools, production ideas, some more home works to plan the process all make together a complete boost in the whole programming.
Basically we should have a better strategy than hard hard-works otherwise or unless it seems to have nothing else to complete even 75% remain pending to complete
GOOD Strategy - with a complete idea of what you have done and whats next will get you a big boost. On the run we should not feel lack of ideas for the next step
good luck
I quit my programing job, started a company and will this year sell millions of worth steel products. I guess leaving my desk was the best thing I ever done. I still love programing, but that´s for fun only.
Higher Education. Knowledge is power. Graduate school exposes you to areas (e.g., algorithm analysis, advance data structures, higher mathematics, different types of languages, compilers) that you wouldn't normally get as in-depth as an undergrad. Also helps to build better critical thinking and problem solving skills. Of course, you need to go the extra mile and learn all that you can while still maintaining your contact with industry (i.e., internships).
All this helps you in the future when you become a developer in understanding the problem and designing a solution.
The !command& command in MATLAB to open up a windows command line:
!COMMAND&
Hyperlink navigation through the code
Not sure if it's correct name, but it's when you do ctrl+click in Eclipse on a method call and it goes to its declaration. It blew my mind first time I tried it.
How about Ctrl+Z.
Garbage Collector
Learning Haskell.
SSH Remote Command Execution
$ ssh user@example.com '<your_remote_command>'
Notepad++ and a Project in the mind
This is how I started to learn and to really love programming :)
Visual Studio (for C++), especially when it comes to debugging.
To find that there are other options for data storage than relational databases (for example: velocity). This really helped me to solve way quickly certain types of problems.
Event delegation
The book Getting Things Done [1] and software that implemented it (I use Things for Mac [2]). Being able to focus on the next action, and not having the 10 other things I needed to do swirling around in my head gave me a big productivity boost.
[1] http://rads.stackoverflow.com/amzn/click/0142000280When you need to do routine search first for some existing libraries. Someone (from Apache usually) have already done it for you. No need to reinvent the wheel.
The ability to write code without errors. Who would've thought, this whole time, it's just a setting in our IDE's.
Discovering that clear requirements followed by careful planning and design makes the programming faster, easier, and less bug prone.
Since I am a bit late to the party most of things that have boosted my productivity have already been listed. To add to the list (which are not programatically related per se) are,
Debug and Caffeine with Internet is the trio that works for me.
Domain Specific Language for UML and Code Generation see http://reboltutorial.com/blog/easy-yuml-dialect-for-mere-mortals2/
For me, it was 'computer progamming is actually human to human interaction'
What that means is, that it's essentially software developer ( designer/programmer ) talking to user .. program just happen to be the medium
What single discovery has yielded the biggest boost in productivity? Well, if the measure of productivity is the ratio of desired outcome by work effort, then this single biggest discovery would be that of process and methodology (i.e. learning how to work smarter). RUP [1] is a good example of process and Agile [2] is a good example of methodology.
You want a tool recommendation? Well, I felt so strongly about how important process and methodology was to outcome in software development that I wrote my own tool to accelerate software development called Code Roller [3].
[1] http://www.ibm.com/developerworks/rational/library/content/03July/1000/1251/1251%5Fbestpractices%5FTP026B.pdfBoost...
i.e.: www.boost.org
Not mine, I'll admit, but focused working: link text [1]
[1] http://www.43folders.com/2005/09/08/kick-procrastinations-ass-run-a-dashIt began when I changed my mindset to feel very good whenever I see a program bug. It gives me great pleasure to remove the bug.
The Samurai Coder, Hideo.
Document databases like MongoDb!! :)
Two things:
Learning there is no substitute for properly instrumenting your code. Nothing is worse then trying to figure what went wrong with no trace/debug information. I am amazed at the amount of"professional" and "Best of Breed" software out there that does not have instrumentation built in.
Test Driven Development.
This little puppy has improved what my classespublic interface looks like, given me the confidence to refactor, and made it SO much easier to test the living crap out of my code.
Whenver I write something like an email validator, or math sequence, or string manipulator -- OMG -- it's just so fun to throw the boundary tests as it and feel the confidence that the method is strong. So much better than before when I would presume I'd find a failure at some point in the unknown future.
MyGeneration [1] to generate all my ORM code and skeleton code structure adhering to the architecture (in other word, it takes care of all the boring and repetitive code)
[1] http://www.mygenerationsoftware.com/portal/default.aspxThis should be fairly obvious... Code Generation. Generating an entire data layer on small to medium-size projects saves countless hours.
MyGeneration + doodads C# data layer and any relational DBMS procedures for all the CRUD.
The Eclipse Modeling Framework (EMF) [1] and the whole EMF ecosystem of related projects.
[1] http://www.eclipse.org/modeling/emf/google, of cause.
Starting linux development which made me realize that hacking up your own solutions is never the best thing to do -- taught me to make healthy use of third party libraries... and really increases productivity.
File Versioning using SVN and unfuddle. This has definitely made working in my University programming labs with a partner much easier. We can work on it whenever we want and leave each other comments about what has changed.. not to mention the file versioning and file differential utilities.
Haskell is the big one. But after that comes the modern IDEs like Eclipse.
Turning my second monitor so that it was vertical. Then adjusting windows such that (for web programming) the window where I was editing code was on the top half, and the browser where I was viewing changes was on the bottom.
At a high enough res, it's basically 3 full-size windows on two physical screens. You'll never go back.
Aside from tools like Intellisense, refactoring tools and all the other answers people have given, I'd have to say good co-workers. People that you can bounce ideas off of and genuinely enjoy hanging out with. People make a huge difference.
Project automation (I include TDD with this). Whenever I discovered the wonders of shell scripting, Make/Ant, automated tests, and one-button builds, programming lost most of its few sour moments.