.
Take the math courses you need. It doesn’t need to be higher-level stuff, but I’ve leaned heavily on linear algebra and some amount of calculus for a lot of what I’ve done.
Don’t use line numbers. Don’t put your entire application in one method. Trust the garbage collector to do its job.
I actually could name lots of things I learned in engineering school that I wish I hadn’t wasted my time on. One big difference is that you work on new and small projects in school and huge and old projects in the real world.
For example, the code I work on at Sun is part of the JDK library that has been in constant development for well over 10 years. Frequently, the hard part of any fix or feature is not the functionality of the fix or feature itself, but rather how it integrates with all of the code around it. Does the fix break compatibility? Does it conflict with anything going on around it? Do you understand the context of the code? This is something that’s particularly difficult in old code bases in which the original developers have all left long ago. Does your team agree with and understand the changes?
I don’t know how to cover such topics in school effectively, especially in the tight time frames of individual classes, but the more students are exposed to team development, versus individual projects, the easier it is for them to become integrated into team development in the real world.
Related to team development, I think code reviews would be a great tool for school. I’ve probably learned more about coding practices and the code I work on through the reviews we do in the client group than in coding itself. You learn how others do things, you get objective perspectives on how you do things, and everyone comes to a shared understanding of how teams should develop common code.
I believe all software engineers should learn about how to ensure that their users have a quality experience. I covered some aspects of that topic in my 2008 JavaOne conference talk Creating a Compelling User Experience.
I think the roles of a software developer are a bit up in the air at the moment. Not many years ago, we developers were sort of gatekeepers: No software was created unless we wrote the code, and we interpreted designs and direction we were given as we thought made sense.
Now, there are a bunch of efforts by the platform vendors — Microsoft, Adobe, Sun, and so on — to empower a less technical audience to create software. Microsoft Expression, Adobe Thermos, and perhaps some future tool from Sun are all about letting a more creative, less technical person create user interfaces that in the past would have required all kinds of code and engineering effort.
This reflects an emerging trend in recent years to reify a new, highly technical designer, often called an interaction designer, as the leading force in software development, rather than engineers. To get a fascinating look at this effort, Google for a transcript of Alan Cooper’s keynote at the Interaction08 conference.
So how will software be developed tomorrow? And where do new entrants fit into all of this? Lots of different people can feel passionate about being involved in the creation of beautiful, compelling software. I think such people have got to figure out whether they are at heart an engineer — if they get their kicks solving hard technical problems — or if they are something else.
There will always be opportunities for great engineers, but as I said earlier, I think the number of these opportunities will shrink as other, less technical personnel play larger roles in the software-development process, using more productive, higher-level tools and frameworks than we have used in the past.
Newcomers should find one or more mentors as soon as you can. Google makes finding information easier than ever, but nothing beats interacting with an expert.
Read the full interview with Ben Galbraith.
Masood Mortazavi: Start Simple and Keep Learning
Masood Mortazavi, a software engineering manager at Sun, started his work with the company on the Java EE development team and as an expert in continuous availability issues and telecom collaborations with the Java software group. In recent years, he’s managed teams of engineers who contribute to open-source databases such as Apache/Derby, PostgreSQL, and MySQL.He has a B.S. (U.C. San Diego) and an M.S. (U.C. Davis) in applied and chemical engineering, and a Ph.D. in computational fluid dynamics with a dissertation titled Vortex-Vortex Interactions and PDF Methods
(U.C. Davis). In addition, he has a master’s degree in journalism (U.C. Berkeley) and an M.B.A. (U.C. Berkeley), and he spent several years pursuing a second Ph.D. in the Graduate Group in Logic and Methodology of Science (math, philosophy, and computer science) at U.C. Berkeley, with a focus on foundations of math, theories of computation, and philosophy. He stopped work on his second Ph.D. soon after joining Sun in 1999.
Start simple. Learn the basics of the language, and even before that, make simple modifications to existing, running programs and see what happens.
Tap into the amazing online documentation resources.
Write the most advanced program you can concoct, choosing something that tickles your imagination, to stretch your own limits, and if you can, to stretch the limits of the Java platform.
Get involved and write programs for some commercial or open-source software that matters and that people actually use.
As you advance, select a great IDE to work with, say NetBeans. (Sometimes this is necessary earlier.)
Keep learning about the systemic use of Java in system programming. There are lots of pleasant surprises there.
Don’t forget that billions of dollars of revenue have been generated and millions of people have been employed because someone at Sun Microsystems invented Java, and a group of dedicated engineers kept producing innovations around it. So contribute to the goodness.
Can you name some things you wish you’d learned in engineering school?
Yes — more design, more marketing, more business, more economics, more management and organizational theory, and finally, more philosophy and art — all in that order or some other combination, to create a good mix of ideas.
Unfortunately, while going through four different University of California campuses, Stanford University, and some other schools as an engineering student and researcher, I didn’t observe an interest in bringing these other disciplines into the life of an engineering student. Unfortunately, students are kept in the silos of their own academic disciplines. Even in science and technology, they are divided into various minidisciplines with very little cross-pollination.
I myself did have some lucky breaks. For example, my Ph.D. advisor, Dr. Wolfgang Kollmann, was very open to my exploration of various areas. While conducting research in computational fluid dynamics with him, I also took advanced courses in biochemistry, embryology, linguistics, and linguistic neurophysiology, along with courses in art, philosophy, economics, and political science. I also worked on the university paper.
This is a very general problem in American education that probably exists elsewhere as well. We’re “mass producing” technologists and scientists with narrow focus and with little care for their development as leaders and creative inventors who can help us to disclose new ways of living, working, and prospering.
European engineering schools have had a tradition of teaching these other disciplines along with engineering. We cannot compete globally unless we train top-notch engineers who have a broad perspective about how their technical work fits into other domains and who understand the institutional place for technology. Otherwise, it’s highly unlikely that we will be able to continue to tap technology for the general social good, beyond the production of gadgets.
Read Masood Mortazavi’s blog.
Raghavan Srinivas: Don’t Be Overwhelmed
Raghavan “Rags” Srinivas, was, until recently, a technology evangelist at Sun Microsystems, focusing on new technology directions and trends. With 20 years as a software developer and 7 years in technology evangelism, his general area of interest is distributed systems, specializing in interoperability, mobility, and security. He publishes a standards column and has represented Sun at a number of standards bodies. Rags holds a master’s degree in computer science from the Center of Advanced Computer Studies at the University of Louisiana at Lafayette.
Don’t be overwhelmed by the language or the platform. If you break it down, the basics of the language are based on object-oriented programming, threading, concurrency, and event-driven programming. It’s necessary to become a master of these concepts since the rest of your career will depend on this foundation.
After that, one can specialize in one or multiple areas, which might involve designing GUIs, doing web stuff, JDBC programming, EJB/JMS programming, security, and so on. If one’s foundation is strong, it’s fairly easy to move from one area to another with relative ease.
Read the full interview with Raghavan Srinivas.
Cay Horstmann: First, Don’t Panic
Cay Horstmann is professor of computer science at San Jose State University in California. He was named a Java Champion in 2005, an award given to individuals working outside of Sun who have received special recognition from Java technology developers across industry, academia, Java User Groups (JUGs), and the larger community. He has a Ph.D. in mathematics from the University of Michigan, is the author of Core Java, and coauthor of Core JavaServer Faces.
First, don’t panic. When students first see the API with thousands of classes, they despair. I used to be able to tell them, “That’s OK, at least the language itself is very simple.” But that was before this:
static <T extends Object & Comparable<? super T>> T
Collections.max(Collection<? extends T> coll
|
As a student, you need to stay within a safe subset of the Java language and the API so that you can use it as a tool to learn some good computer science.
Next, code. Professional programmers often forget how hard it is for most beginners to actually program. It’s so unlike most activities. The computer is unforgiving. When you’re wrong, you’re told very quickly that you were sloppy or stupid — not a good thing for a fragile ego. And when you are wrong, you need to stop and think. Random tinkering rarely gets you anywhere.
This is a really hard sell to today’s students. Your ego isn’t stroked very much, and you’ll get a headache trying to fix your mistakes. A career in divorce law sounds so much more attractive. But when you succeed, it sure feels good. The trick is to get students to that point.
Last summer at a faculty summit at Google, bigwig professors from big-name universities expounded on their efforts to reform the computer science curriculum and make it less focused on programming. The organizers from Google said, “That’s all fine and good, as long as the students can code when they graduate.”
Read the full interview with Cay Horstmann.
Arun Gupta: Try Different IDEs
Arun Gupta is a technology evangelist for web services and Web 2.0 apps at Sun. He was the spec lead for APIs in the Java platform, a committer in multiple open-source projects, a participant in standards bodies, and a contributor to Java EE and SE releases. He holds a B.S. in electronics and an M.S. in computer science, both from Delhi University, India.As a beginner, I used a lot of vi (visual editor). But now I’ve been using IDEs, like the NetBeans IDE, for the past couple of years, and I must say my productivity has gone up multifold. Specifically, features like boilerplate text, refactoring, and debugging are much easier to work with in IDEs than manually or using pluggable scripts in the vi environment.
For instance, if I’m writing a Java bean, then I need to give the class name, field names, and their types, and the rest of the boilerplate text of getters/setters is generated for me. I can set up a breakpoint when a particular exception is thrown, and the IDE will halt whenever that exception is thrown. I can change a class name or move it to a different package name, and all of its references are updated accordingly. These are simple but powerful examples.
And some IDEs have very powerful features such as remote debugging. The IDEs keep me focused on the logic part of my code and take care of code logistics for me. I really recommend that new users try out different IDEs and pick one of their choice. For instance, the NetBeans IDE is available free.
In school, I didn’t realize the importance of documenting. I would go through design, develop, and test cycles but would not document the design decisions or add comments in the code. This would make even my own code unreadable to me, sometimes a few weeks after I wrote it. UML designing and adding Javadocs liberally through the code has helped me write readable code.
Secondly, I wish we had more participation from industry in school. It would have been good for someone currently working in the industry to talk to us about industry trends, practices, and standards.
Every time I visit Delhi, I go back to my school, meet the faculty, and mingle with the students. I give a presentation on the latest industry standards in my field, discuss the importance of coding standards, and show code samples. During my last visit, I started working with some students on a new web services-related project and hope to inculcate in them the great coding practices that we follow at Sun.
Read the full interview with Arun Gupta.
Rick Cattell: Good Technology Is Only 10% of Success
Rick Cattell is an independent consultant in database systems and in engineering management. He was previously a Distinguished Engineer at Sun Microsystems and has worked most recently on open-source database systems and proprietary innovations in database systems. He served for more than 20 years at Sun Microsystems in management and senior technical roles, and for more than 10 years in research at Xerox PARC and at Carnegie-Mellon University, where he received his Ph.D. in computer science.Cattell is best known for his contributions to middleware and database systems — particularly enterprise Java, object-oriented databases, object/relational mappings, and database interfaces. The author of several dozen papers and six books, Cattell is also known for a talk titled “Things I Wish I’d Learned in Engineering School,” which he has presented at universities around the United States.
First, I didn’t realize how important it was, for me at least, to work on things that people are actually going to use. I didn’t realize that it wasn’t very satisfying to write research papers or even to build working systems if the results of my labor weren’t going to be used in the real world.
I also didn’t realize that good technology is only 10% of success. If your management doesn’t know how to manage a successful engineering project, or your marketing department doesn’t know how to access the customers, or doesn’t tell you what the customer wants, or if your lawyers don’t handle your intellectual property correctly, or if the chief architect doesn’t have the ability to create a consistent and simple architecture, then your work can be for naught, and you can spend years building things that never see the light of day.
Read the full interview with Rick Cattell.
Chuk-Munn Lee: Choose an Area of Your Immediate Need
Chuk-Munn Lee has been programming in the Java language since 1996, when he first joined Sun Microsystems in Hong Kong. Now based in Singapore, he works as a Sun Java technology evangelist and frequently helps individual developers and software vendors to architect and prototype both their server and desktop-based Java applications. His more recent work has focused on Swing-based client applications. He also keeps ISVs up-to-date on the latest developments in the Java platform and what’s on the horizon.
He graduated in 1987 from the Royal Melbourne Institute of Technology in Melbourne, Australia, where his favorite subject was compiler theory.
First and foremost, I would suggest exploiting the web. There’s tons of learning material. There are forums to post your queries and download open-source code. Getting books is another good way, but I’ve had people complain to me that the moment they buy any technology-related book, it’s already out-of-date. I suggest trying the local library or subscribing to something like Safari Bookshelf.
For a beginner, the plethora of Java APIs can be quite intimidating. Choose an area of your immediate need, for example, web programming, servlet/JSP/JSF, GUI, Swing, persistence, JDBC/JDO (Java Data Objects)/CMP (container-managed persistence), or what have you. Work on a project that gives you experience in using the API, the development tools, and the runtime environment. Keep the project manageable — I tend to pick something that is fun and that I can complete in three months max.
Read the full interview with Chuk-Munn Lee.
Tom Ball: Programming Is Still a Craft
Tom Ball is a software engineer at Google, working on Java development tools. He began working with Java in 1994 as part of Sun’s JDK, AWT, Swing, Jackpot, and NetBeans teams, and contributed to the JavaFX Script compiler team. He has no formal university education.Programming is still a craft, so the more you can work with senior developers, the more you’ll learn of the important stuff the computer science professors don’t teach. If you have time, join an open-source project and help out in any way you can to learn and to build credibility with your peers.
But don’t join every project you find interesting. I’ve seen many enthusiastic newcomers spread themselves too thin, overcommit, and thus not be taken seriously.
Finally, get to know the various Java communities through their forums and blogs, then join in. We’re a great group!
Read the full interview with Tom Ball.
See Also
Tom Ball: Interview and Blog
Joshua Bloch: Interview and Book, Effective Java
Rick Cattell: Interview and Home Page
Ben Galbraith: Interview and Blog
Arun Gupta: Interview and Blog
Chet Haase: Interview and Blog
Cay Horstmann: Interview and Blog
Chuk-Munn Lee: Interview and Java SE 6 Troubleshooting Article
Masood Mortazavi: Blog
Tor Norbye: Interview and Blog
Raghavan Srinivas: Interview and Blog
I wish all my fellow students to make sure that they follow all these tips to leverage their programming to code for the future and to code the future!!!!!