The first image of a black hole, from the galaxy Messier 87
April 10, 2019
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!
http://www.sci-news.com/astronomy/collision-two-neutron-stars-pre-solar-nebula-07154.html
NASA plans a robotic mission to search for life on Europa | io9
It looks like it’s finally going to happen, an actual mission to Jupiter’s icy moon Europa — one of the the solar system’s best candidates for hosting alien life.
Yesterday, NASA announced an injection of $17.5 billion from the federal government (down by $1.2 billion from its 2010 peak). Of this, $15 million will be allocated for “pre-formulation” work on a mission to Europa, with plans to make detailed observations from orbit and possibly sample its interior oceans with a robotic probe. Mission details are sparse, but if all goes well, it could be launched by 2025 and arriving in the early 2030s.
This is incredibly exciting. Recent evidence points to a reasonable chance of habitability. Its massive subsurface ocean contains almost twice as much water as found on Earth. The water is kept in liquid state owing to the gravitational forces exerted by Jupiter and the moon’s turbulent global ocean currents. The good news is that a probe may not have to dig very deep to conduct its search for life; the moon’s massive plumes are ejecting water directly onto the surface.
[Read more]
Hubble Space Telescope Image of Globular Cluster NGC 6397
Credit: NASA, ESA, and H. Richer (University of British Columbia)
“Nikola Tesla On Top Of Pike’s Peak.” Denver Rocky Mountain News, May 17, 1899.
(Sorry, no Kilometers 😥😥) ⠀⠀Via NASA