Aim your advice toward a competent *nix user who knows a little about everything, but doesn't know anything in any real depth.
* Learn a good text editor well. I use vim, but learn whatever you feel comfortable in. Just make sure it doesn't stand in your way.
* Learn the core unix commands and use them often (tail, sort, uniq, tee, pushd/popd, etc)
* Use a configuration management tool (I use puppet, some people like cfengine, there's also chef)
* The second you see yourself doing something for the third time, script it (It goes without saying: learn a decent scripting language well)! Keep typing same long command? Alias or macro it. I can't stress this enough.
* Automate builds, tests and all doc generation. Don't repeat yourself. Use your downtime to reduce repetition. See what can be scripted.
* Keep everything in source control. Have a 'misc' repo and if you're starting to work on a script just to do some basic maintenance, add it to repo and keep it up to date. You never know when it will grow beyond a toy and you never know if you might break its functionality by messing with it.
What really keeps me productive is liking the work I'm doing. Nothing else comes close.
Also, after getting my laptop bricked by the Ubuntu 9.10 upgrade I recovered my entire project from it.
A REPL for any language used atm. Cool if coupled with the above.
REPL/shell history with incremental search, like readline. This is the most powerful single feature I use. Hitting Ctrl-R and typing usually 2-3 keys gives me back the previously entered line I intended to find. If your REPL doesn't have it embedded, use rlwrap. Look at -H option to control where your history is saved exactly. Use big history size if you want to be reminded what you typed months ago - having 10/100k of history entries doesn't hurt really as it's still quick.
Tab completion is cool as well. For rlwrap you can pregenerate keywords for completions (eg. your favorite libraries) and it will add completions for terms entered during current session.
A good SCM for tracking changes even if working alone. I find centralized ones annoying; hopefully we've got Darcs & Git, both awesome.
Using multiple desktops/workspaces to try new ideas in a space which doesn't clutter your current visual, so you don't waste your time rearranging it.
Pen & paper. A habit of using it to get some distance. You can always scan a sheet of paper if needed. I know not every boss is going to accept such scan as a documentation ;), but preparing deliverable docs is something different than making useful notes to yourself.
Lack of running IMs, MUAs, popup calendars and other disturbances during coding. All that stuff can wait. The focus is everything.
One exception is when you do remote pair programming, then some VoIP app is handy. OTOH not many people work this way.
A sign of a good tool is when you still enjoy using it after, say, ten years. Most of the above apply here.
[edit: I meant MUAs not MTAs of course]
As a software developer on *nix I spend a lot of my time manipulating text: code, e-mail, news, forums, documentation, etc.
I can do all this from Emacs which is its greatest strength for me. It might not have the latest and greatest editor features but generally it'll quickly pick them up (within weeks, months or a year someone will have written an Emacs version and I've also written them myself).
So I don't have to suffer all kinds of different programs for doing the same activity: manipulating text. Usually all those programs (web browsers, text editors, word processors, news readers, e-mail clients, etc.) only contain a subset of Emacs' powerful editing features.
It is also available for a lot of different platforms.
It's amazing how much time you can save if you analyze the problem a bit more deeply. It's much easier to use the correct algorithm/implementation if you truly understand the problem.
A second note: Emacs is the one piece of software that makes me the most productive.
echo "127.0.0.1 news.ycombinator.com" >> /etc/hosts
Emacs has helped me eliminate software clutter. Seriously. Computer and software maintenance is a major productivity killer for me. Install this upgrade, update this app... I really hate that process, and even Mac OS does not hide it behind the scenes.
Emacs and org-mode helped me get rid of my mess of "productivity" apps, which also means less thinking about which app to use for what. It helps that Emacs just helps me bend text files into my thought flow, and I don't have to adapt to Productivity-App-Of-The-Day's model of anything. To-do lists go into an org-mode file. Latest thoughts about work can go into a an org-mode file. I can slice and dice them and write them as free-form or as organized as I want. It's immensely liberating. It helps that I don't have to worry about a proprietary file format biting the dust.
And it's telling that there's even iPhone app for it http://mobileorg.ncogni.to/ . Wow. RIP OmniFocus.
grep, sed, awk, sort, uniq, shell scripts and pipes now do things in seconds that took me hours if not days to do with Windows GUI tools. Of course my experience plays a big part to that but I don't think that I would be were I am without those.
I use putty for my SSH connections. It is a nice way to remotely access your server from a Windows client.
The programming language you use should fit the job so that is something that is specific to the project.
Using subversion for version control is really one of the best tools available. I would fear making changes in my code even if I had backups because changing it might break functionality, and I would spend a long time hunting for solutions of what I did. With any kind of version control system (and subversion is very easy to use), you can make changes without worry, and you can get old code you wanted to keep even though you were not using easily (because commented code is evil). It encourages you to clean your code, remove dead code, and to refactor your code because you know you can always go back.
You should learn vi in case you must use an archaic machine where you only have remote access and do not want to try installing new apps. (Some very old yet very stable telephone switches running with Solaris interfaces come to mind.)
Grooveshark for listening to music. The site is fantastic, and I do not need to waste time hunting for music that gets me in the mood to work.
Lastly, a notepad. I keep a notepad beside my bed. I find that it helps me sleep. I will be thinking of code, and one idea leads to another as I relax. So, instead of staying up for hours focusing on it (This has happened to me hundreds of times.), you can write it down. My brain then relaxes because it knows I do not need to remember it. Then, I can go to sleep. In the past, I would not be able to actually fall asleep unless I got up, coded what I was thinking about it, and then went back to sleep. Now I know I can put it off until tomorrow and actually get a good sleep for the night.
I practice a certain kind of meditation. It has side effect that many things, including hacking solutions, come to mind during a session. I use a notepad to quickly scratch one catch-phrase which will bring back whole idea later, and let that idea go which is the purpose of this particular meditation. Often I'm quite full of fresh ideas after such session. It's amazing and I'm very
thankful to the teacher who gave me this method.
Most frequently used Gnome Shortcut : Ctrl + Alt + Arrow Keys to switch workspaces
Quicksilver like launcher for Linux with numerous plugins : Gnome-Do
Version Control : git
Text Editor : vim
Managing multiple remote ssh sessions : screen
It helps me keep track of side projects. For a long time I had trouble remembering where to pick up a project and would get distracted by unimportant parts. JIRA helps keep that to a minimum and makes me feel more serious about them.
I even keep one project setup in it for personal stuff (renew passport, etc) just to keep all the TODOs in one spot, but whenever you tell people that they always make some wise-ass crack about using it to file a bug report about you personally...
That could be an interesting way to learn more about yourself and how others perceive you. Let people file bugs against you. How am I doing as a manager? As a husband and father? Are any of the tickets being closed?
It would take a pretty strong personality, though, to welcome that level of criticism.
Although I would think it would be more useful in terms of filing bugs about yourself. After all if we try to change ourselves to meet everyone else's expectations then were not much more than a shell after a while...
On a less self-serving note, I'd also suggest (at least) two monitors, a good keyboard, and a good desk chair. Fatigue, RSI, and task-switching are all very real productivity drains.
I find Kraftwerk is gold for this. Try "Computer Love" or "Radioactivity". There's more esoteric ambient stuff like Maeror Tri if you're curious enough to hunt around a bit. Also try Ildjarn's ambient music. (Ignore his heavy metal -- I like it, but it's certainly not for everyone.)
- Python [You can write quick programs on the command line or use it as a calculator]
- ToDo List/Notes App running on the background.
- Multiple Desktop Windows(workspaces)
- Dual Monitors.
Of course if you're using Unix, you can get the linux version (which I don't believe is officially supported).
Just knowing where I am spending my time makes me more productive and less likely to randomly web surf etc
Saving snippets of how I get things done.
Always saving command lines in shell scripts, sometimes with parameters, instead of just trying to remember them. Bash history is great, but it isn't available when changing systems, hosts, and jobs.
Always making a sandbox directory for every idea/project, under a directory named for the current year. This includes my own ideas as well as stuff other people did that I download to play with. When a new year rolls around, most of the directories don't get carried over; they just stay in the old year archived.
Tagging every new project with keywords.
Automating everything possible.
Most fantastic win ever: VMware images that are preconfigured to whatever state they need to be in to debug whatever I'm working on. Could be Amazon AMIs; I use VMware atm.
emacs, vi, sort, uniq, comm, find, ack, diff, patch, perl, perltidy, man, git
My top level screen session is a list of hosts I log into. On each of those hosts, I also run screen (screen within screen) to give me virtual windows on that host. As a UNIX admin this makes my life a lot more productive, as I'm often logged into 5-10 machines at once. Instead of hunting around for the right window, I can jump to screens and/or subscreens by name, without taking my hands off of home row. For me, one large multiplexed terminal window is best. It also helps if your terminal program can go full screen (like iTerm) for maximum old-school terminal concentration.
Learning how to edit text without taking your hands off home row (control key sequences) is invaluable. This skill will help you in your editor, at the bash prompt, inside of any program you can run with rlwrap, and in OSX (or windows) edit widgets. With a bit of work you can configure emacs keys in every GUI and non-GUI application you use. For Windows users XKeymacs works well for this. Linux users can configure GTK to support emacs style editing. Having fast and universal controls for text editing makes me productive.
Why wonder why the a program is misbehaving? See every system call it makes as it makes them, complete with arguments and return codes. Even attach it to a running process to find out what it is doing in real time. This tool has allowed me to diagnose and solve more thorny problems than any other in my arsenal. For example, you're trying to figure out what arguments that gcc is using to invoke the linker in a Makefile, or which order that the linker looks for libraries, strace can tell you all of this, when you'd be otherwise scratching your head and guessing.
Knowing Regular expressions can make your life a lot easier. In your editor they allow you do all kinds of advanced text manipulations, even some dumb refactoring. Knowing them also allows you to do some great parsing in sed, perl, grep (ack is a better grep btw), whatever. Once the regexp lightbulb has turned on your productivity can go way up.
Server Side IMAP Email Filtering
Regular expressions reminded me of this, but if you have all your email handling rules (filtering, organizing into folders etc) done on the IMAP server side, it frees up your email clients to be stupid. They don't have to do any of that. Your email inbox will look the same in Pine, Mutt, Mail.app, Outlook, your phone, whatever. This is the promise of IMAP. I use maildrop on my own IMAP server for this.
- No simple way to keep a small IM status window open in the corner of a workspace
- Limited support for resolution-dependent windows, such as videos, games or remote desktops
- No notification bar for status apps to utilize, such as pidgin or network-manager
- No integration with modern desktop environment features or tools, such as media keys for rhythmbox, launchers like gnome-do, network-manager, automatic disk mounting, screen lock, etc
Gnome and compiz have solved a lot of problems that actually make a Linux desktop usable in modern contexts.
Apologies for the evangelism. :)
Most of my activities concern the most recent things I've moved with or played with. Fresh lets me handle all of that without worrying about any other workflow. Downloads/screenshots/etc all go through it.
Also, Excel (or other spreadsheet program). Not usually thought of as a tool, but putting small functions in cells and passing inputs/results cell to cell is a good way to start the actual implementation of a solution.
Only thing that's kind of annoying is that the whole world hasn't moved to Perl regexes yet (with which I'm most familiar and think most fluently). I nearly punched the air when I learned Apache used PCRE for stuff like mod_rewrite.
* JotBot (note: it's my own commercial app, but I use it every day)
* Todoist.com + a few custom apps that work with it
* Scores of little scripts to automate assorted tasks
* My G1, for notes and reminders
* git; almost everything gets a repo, so I more easily try things out while not risking losing previous work
Not at all related to 'nix, but most important:
* World's greatest wife
* Smart & good friends
I fear I have fallen to the monks of old: "First, boil water."
Django for framework
Once you've gone the Way Of The Emacs, there is no reason to use vim... unless you have some internal application written in vimscript, of course.
Viper just gets you insert-mode and command-mode. It's still Emacs.
But hey, these two programs are great. I've tried other IDEs, but always end up coming back to one of those two for real work. Some things are easy in one and annoying in the other so they complement well.
If you want to use C for your "type I virtual machines", great. But stop writing music players and web browsers in it.
SLIME in Emacs is comparable (better in some ways, worse than others) if you're hacking in a Lisp. It is really nice to work with code at a higher semantic level than just ASCII text, sometimes.
(I also hear that VC++ has similar or even better refactoring features, but I haven't used it.)
Having a good reason why you are doing something
2) trackers, task focusing software: GTD-free, Trac, Mylyn, pyroom, etc.;
3) blind typing (to type fast), workrave (to stop typing);
4) somebody else, which will review my work.