提高专业能力的书单
- Code Complete (2nd edition) by Steve McConnell
- The Pragmatic Programmer
- Structure and Interpretation of Computer Programs
- The C Programming Language by Kernighan and Ritchie
- Introduction to Algorithms by Cormen, Leiserson, Rivest & Stein
- Design Patterns by the Gang of Four
- Refactoring: Improving the Design of Existing Code
- The Mythical Man Month
- The Art of Computer Programming by Donald Knuth
- Compilers: Principles, Techniques and Tools by Alfred V. Aho, Ravi Sethi and Jeffrey D. Ullman
- Gödel, Escher, Bach by Douglas Hofstadter
- Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin
- Effective C++
- More Effective C++
- CODE by Charles Petzold
- Programming Pearls by Jon Bentley
- Working Effectively with Legacy Code by Michael C. Feathers
- Peopleware by Demarco and Lister
- Coders at Work by Peter Seibel
- Surely You're Joking, Mr. Feynman!
- Effective Java 2nd edition
- Patterns of Enterprise Application Architecture by Martin Fowler
- The Little Schemer
- The Seasoned Schemer
- Why's (Poignant) Guide to Ruby
- The Inmates Are Running The Asylum: Why High Tech Products Drive Us Crazy and How to Restore the Sanity
- The Art of Unix Programming
- Test-Driven Development: By Example by Kent Beck
- Practices of an Agile Developer
- Don't Make Me Think
- Agile Software Development, Principles, Patterns, and Practices by Robert C. Martin
- Domain Driven Designs by Eric Evans
- The Design of Everyday Things by Donald Norman
- Modern C++ Design by Andrei Alexandrescu
- Best Software Writing I by Joel Spolsky
- The Practice of Programming by Kernighan and Pike
- Pragmatic Thinking and Learning: Refactor Your Wetware by Andy Hunt
- Software Estimation: Demystifying the Black Art by Steve McConnel
- The Passionate Programmer (My Job Went To India) by Chad Fowler
- Hackers: Heroes of the Computer Revolution
- Algorithms + Data Structures = Programs
- Writing Solid Code
- JavaScript - The Good Parts
- Getting Real by 37 Signals
- Foundations of Programming by Karl Seguin
- Computer Graphics: Principles and Practice in C (2nd Edition)
- Thinking in Java by Bruce Eckel
- The Elements of Computing Systems
- Refactoring to Patterns by Joshua Kerievsky
- Modern Operating Systems by Andrew S. Tanenbaum
- The Annotated Turing
- Things That Make Us Smart by Donald Norman
- The Timeless Way of Building by Christopher Alexander
- The Deadline: A Novel About Project Management by Tom DeMarco
- The C++ Programming Language (3rd edition) by Stroustrup
- Patterns of Enterprise Application Architecture
- Computer Systems - A Programmer's Perspective
- Agile Principles, Patterns, and Practices in C# by Robert C. Martin
- Growing Object-Oriented Software, Guided by Tests
- Framework Design Guidelines by Brad Abrams
- Object Thinking by Dr. David West
- Advanced Programming in the UNIX Environment by W. Richard Stevens
- Hackers and Painters: Big Ideas from the Computer Age
- The Soul of a New Machine by Tracy Kidder
- CLR via C# by Jeffrey Richter
- The Timeless Way of Building by Christopher Alexander
- Design Patterns in C# by Steve Metsker
- Alice in Wonderland by Lewis Carol
- Zen and the Art of Motorcycle Maintenance by Robert M. Pirsig
- About Face - The Essentials of Interaction Design
- Here Comes Everybody: The Power of Organizing Without Organizations by Clay Shirky
- The Tao of Programming
- Computational Beauty of Nature
- Writing Solid Code by Steve Maguire
- Philip and Alex's Guide to Web Publishing
- Object-Oriented Analysis and Design with Applications by Grady Booch
- Effective Java by Joshua Bloch
- Computability by N. J. Cutland
- Masterminds of Programming
- The Tao Te Ching
- The Productive Programmer
- The Art of Deception by Kevin Mitnick
- The Career Programmer: Guerilla Tactics for an Imperfect World by Christopher Duncan
- Paradigms of Artificial Intelligence Programming: Case studies in Common Lisp
- Masters of Doom
- Pragmatic Unit Testing in C# with NUnit by Andy Hunt and Dave Thomas with Matt Hargett
- How To Solve It by George Polya
- The Alchemist by Paulo Coelho
- Smalltalk-80: The Language and its Implementation
- Writing Secure Code (2nd Edition) by Michael Howard
- Introduction to Functional Programming by Philip Wadler and Richard Bird
- No Bugs! by David Thielen
- Rework by Jason Freid and DHH
- JUnit in Action
Start by carving out 20% of your time to devote to your own skills development. If possible, it'll be better if that 20% comes from one or two hours a day rather than a day a week because you can then make a daily habit out of improving your skills. Your productivity may decrease initially (or it might not change much if you're replacing web surfing or other distractions), but the goal is to make investments that will make you more effective in the long run. So what should you do with that 20% time? Since you're at a well-known tech company, you should take advantage of the resources available to you. Here are 10 suggestions: Study code on core abstractions written by the best engineers at the company, and understand why certain choices were made and how they were implemented. For example, if you're at Google, read through code in some of the core libraries written by early engineers like Jeff Dean, Craig Silverstein, or Ben Gomes. Start with ones that you've used before, and ask yourself if you would've written similar code for various parts and how you might learn from their examples. If you're not too efficient on your text editor or IDE, ask some of your more effective co-workers if they'd mind you watching them for a bit while they're coding. Are they using keyboard shortcuts or editor functionality that you're not familiar with but that make them much more efficient? If so, learn and practice them. Search for productivity tips on Google for whatever development environment you use. When I was first learning Emacs, for example, Steve Yegge's very good 10 Specific Ways to Improve Your Productivity With Emacs made me noticeably more efficient. Even in re-reading parts of that page for this answer, I've learned something new. Read through any technical, educational material available internally. Google, for instance, has a wide array of codelabs that teach core abstractions and high-quality guides of best practices that veteran engineers have written for various languages based on decades of experience. If your company doesn't have similar resources, Google's open sourced some of their guides: https://code.google.com/p/google.... Master the programming language(s) that you use. Read a good book or two on the languages. Focus on developing a solid grasp of the advanced concepts in that language, and gain familiarity with core, language libraries. Make sure that at least one of your languages is a scripting language (e.g. Python) that you can use as your Swiss army knife for quick tasks. Send your code reviews to the harshest critics. Optimize for getting good, thoughtful feedback rather than for lowering the barrier to getting your work checked in. Ask for a more detailed review on implementations that you're not too confident about. Enroll in classes in areas you want to be stronger at. These could be ones offered on the company campus, on nearby university campuses, or online. Many of the larger tech companies will even pay for your classes. If you want to get better at programming, take more hands-on classes on topics like design patterns or on some programming language. Build a good reading list of technical books, and start reading. Your company may even reimburse you. Here's a start: What is the single most influential book every programmer should read? Work on different types of projects, and use them as learning opportunities. If you find yourself always doing similar tasks using similar methods, it's going to be hard to get out of your comfort zone and to pick up new skills. Make sure you're on a team with at least a few senior engineers that you feel like you can learn from. If you're not, consider changing projects or teams. This'll help increase your learning rate for the remaining 80% of your time. Write more code. If you feel like programming is your weak point, spend more of your time on building and writing code since you won't get better unless you practice the craft. To the extent that you can, shift time away from other engineering-related duties like managing projects, fixing bugs, attending meetings, designing products, etc. Good luck!
http://www.quora.com/How-can-I-quickly-improve-my-programming-skills