So much advice is heaped upon beginners that it can be hard to know where to start. However, these five practices are the foundation upon which everything else is built. The beginner I have in mind has a basic understanding of how programming works, has written mostly small programs of varying complexity, and is heading off to either a career in the field or committed to excellence for his or own personal projects. There is only one truly foundational activity in programming: writing code. To be good at it, you’re going to have to write a lot of code. That big body of work can be a vehicle for growth, or an exercise in repeatedly practicing a limited set of skills. To avoid the latter, you need to: Read a lot of code. Specifically, read a lot of code by excellent programmers. Not just good programmers, like the guy down the hall, but excellent ones. Due to the huge amount of open source today, this is easy to do. When I was learning Java, I read code from the Tomcat project and from the CI server, Cruise Control. I’ve read lots of good code since. It might be tempting to look for main() and start from there, but you’re likely to spend a lot of time just reading set-up code and command-line parsing. I prefer to scan the filenames to look for some activity that interests me and then dig into those files. It’s not crucial to understand the whole project or the ins and outs of the entire design, you’ll wear yourself out doing this. Read the code. Look at the comments, see what the authors are doing, and how they went about it. Learn your tools thoroughly. I think the greatest loss of programming time is not in debugging or rewriting code, but in the innumerable seconds lost here and there by developers who don’t really know their tools. I am referring to: the IDE, the language, the build system, and the VCS. Of these, the IDE and the language are by far the most important. You should, after a few weeks of practice, know almost every keystroke combo in the IDE, so that you touch the mouse only when it saves a lot of keystrokes. If you know the keystrokes, you know the commands. If you use the mouse only, you know only menus on which you tend to click on the same one or two entries. Knowing the IDE is pure discipline. Knowing large languages, such as Java or C++, takes more than discipline. They’re huge, as are their libraries. Reading is the best approach, in my view. Read code that uses features you don’t know and you’ll look for opportunities to use them. Books (rather than blogs) are another excellent source. Read about features that are on the periphery of what you use currently, and soon you’ll find the periphery expanding. Knowing the VCS and build systems make you a desirable team member — who doesn’t waste time due of ignorance of important operations. Plan your code before you write it. I think this is the most difficult item on this list. In exchange, it probably delivers the most benefit. I’m not thinking of formal design — at your stage, that’s unlikely to be necessary. But you do need to plan out the code in some manner other than carrying it around in your head. The simplest approach is to write up a small document (I frequently use a mind map): What are the requirements for this code? How will you implement it? What do I need to know that I don’t know now? What are the objects I will need or need to create? And write this out. Only then begin to code, you’ll find the code much easier to write, to document, and to get correct. Save your notes — they’re great reference material. Write lots of code and have it reviewed. If your site does not do code reviews, do them yourself. Find the best programmer who’ll give you useful advice in a way that can be heard and understood. Don’t be a pest, but don’t avoid the process because you’re shy, busy, or feel you’re good enough, etc. Code reviews should be part of your programming life. Be creative. Try pair programming with someone more senior than you for an afternoon. The important thing is that you need feedback that you cannot give yourself. Write tests as you code. This advice is perhaps the only controversial item here. It’s not an endorsement of TDD. But it is an endorsement of knowing that your code works in most scenarios it will face. Start with unit tests and exercise new code with edge-case values. For example, does your function work if it is passed a negative value, or the maximum integer size? If not, does it throw an informative exception or just blow up? If not an exception, have you narrowed the range of inputs with asserts? If so, test the asserts. Use the planning you did earlier to write mocks, and then begin testing your new code with objects you still need to write. This will clarify design issues in your current code and the upcoming objects. Save your tests and run them prior to every check-in, so that they can be early warning systems for later code that breaks your current code. There’s a lot more advice and many wise sayings that can be added to this list. But that’s part of the problem: There’s so much advice available that it’s difficult to know exactly where to start. For that reason, I purposely limit my recommendations to just five points. If you apply them with diligence, you’ll soon find two things: You’ll be able to handle progressively larger and more important tasks, and you’ll look back in embarrassment at code you wrote just a few months ago. Both experiences are sure signs of progress. Good luck!
“Finally, there are the wavelength limits as well. Stars emits a wide variety of light, from the ultraviolet through the optical and into the infrared. It’s no coincidence that this is what Hubble was designed for: to look for light that’s of the same variety and wavelengths that we know stars emit.
But this, too, is fundamentally limiting. You see, as light travels through the Universe, the fabric of space itself is expanding. This causes the light, even if it’s emitted with intrinsically short wavelengths, to have its wavelength stretched by the expansion of space. By the time it arrives at our eyes, it’s redshifted by a particular factor that’s determined by the expansion rate of the Universe and the object’s distance from us.
Hubble’s wavelength range sets a fundamental limit to how far back we can see: to when the Universe is around 400 million years old, but no earlier.”
The Hubble Space Telescope, currently entering its 30th year of service, has literally revolutionized our view of the Universe. It’s shown us our faintest and most distant stars, galaxies, and galaxy clusters of all. But as far back as it’s taken us, and as spectacular as what it’s revealed, there is much, much more Universe out there, and Hubble is at its limit.
Here’s how far we’ve come, with a look to how much farther we could yet go. It’s up to us to build the tools to take us there.
Hubble Space Telescope Image of Globular Cluster NGC 6397
Credit: NASA, ESA, and H. Richer (University of British Columbia)
Chemical Gardens, a new investigation aboard the International Space Station takes a classic science experiment to space with the hope of improving our understanding of gravity’s impact on their structural formation.
Here on Earth, chemical gardens are most often used to teach students about things like chemical reactions.
Chemical gardens form when dissolvable metal salts are placed in an aqueous solution containing anions such as silicate, borate, phosphate, or carbonate.
Delivered to the space station aboard SpaceX’S CRS-15 cargo mission, the samples for this experiment will be processed by crew members and grown throughout Expedition 56 before returning to Earth.
Results from this investigation could provide a better understanding of cement science and improvements to biomaterial devices used for scaffolding, for use both in space and on Earth.
Follow the growth of the chemical garden and the hundreds of other investigations constantly orbiting above you by following @ISS_Research on Twitter.
Make sure to follow us on Tumblr for your regular dose of space: http://nasa.tumblr.com