I am a student in his last semester going for a B.S. in Computer Science. I would like to eventually transition into the space exploration industry (NASA, SpaceX, Boeing, Lockheed Martin, etc). I know nothing about avionics and i would like to learn more about the subject, specifically the software side. I have found little information online. Please give me reference material (books, websites, etc.) to learn about this area. Your point of view and additional information is strongly welcomed.
Ok, I was posting this as a comment but was becoming ridiculously long...
I worked for most of my professional life in fields that are somehow related. I can see that there are three areas of study that will help you a lot here.
First: programming languages. Knowing a language used in the industry is a plus. Now I am working in the automotive/transportation industry; I am not working on safety critical material, so we just use standard C/C++. Even at that level a good knowledge of low-level programming and software (how to write a simple driver, how to interact with a device using ioctl, etc..) are very useful.
Before that, I worked on a field related to programming languages and compilers, especially on the simulation and analysis of concurrent code. Among the others, I briefly interacted with people working for Airbus (professors that are in academia, but help to build real software). They still see and use a lot of Ada out there, so.. knowing that is good :) I also know for a fact that Java is also used, together with special tools for verification of the code.
Which bring us to the second: everything related to the verification of software, both from a theoretical and a practical point of view, will help you hugely in this industry. Study and practice with runtime monitors and model checkers, at least. Learn about various static analysis techniques, like abstract interpretation. Take classes about that, if you can at your school.
And third: study and practice with embedded systems and with the (more rare) real-time OSes and how they work (and how you do program them). Get yourself an arduino or a netduino (not a raspberry PI - too high level, too many resources there!) and practice with them. Lear about uboot.
I suspect the only answer is "on the job".
Learn both C and C++ and some embedded programming and try applying for any junior positions in companies doing avionics you'll find.
Mobile phones can't really be considered embedded any more, but you should be able to find a course in robotics or cybernetics (industrial controllers) or an internship involving those. An internship doing consumer electronics could help too.
And don't forget the aircraft manufacturers don't do avionics themselves but either buy standard modules from vendors like Garmin or Honeywell or subcontract it to many consulting companies. And those companies often do other kinds of embedded (automotive, industrial, etc.) too.
Notes: I remotely know someone who did avionics and I don't think he specifically aimed for it; he was just good C programmer and applied for a job. I myself did some automotive, again just applied for (junior; it was right after graduation) C/C++ job in a consulting company that was originally mobile and was shifted to automotive as the original project didn't really get going.
For avionics, the following will be essential just to get your CV considered:-
- Good skills with C
- Control theory, particularly state space and beyond
- Related to control theory, a strong foundation in maths
- Experience with hard-real-time processing
- Experience working to coding standards
- Familiarity with review processes
The following would also be useful:-
- Experience of Ada, and possibly C++
- Some knowledge of safety-related procedures (DO-178B, MISRA, etc.)
- Knowledge of test-driven development
- Experience of common RTOSes such as VxWorks
- Experience of low-level programming on microcontrollers
With a BS (not BEng) in Computer Science (not electronic engineering) then you may be at a disadvantage on some of this. You MUST choose your projects to get the right experience you want to take to employers.
Of course you're only at the very start of your working life though. A degree is only the start, and any employer hiring graduates will know that you need training up. A good employer will look more at generally how bright you seem to be and how well they think you can pick up new skills. If you're playing with tech in your free time, this is probably a good thing to bring to interviews too.
I have a friend who works in Avionics software. Including space projects.
He got into it by applying for a job at companies that work in that field or similar, before then he didn't have any special avionics training or experience.
Avionics work tends to make more use of programming languages that are not mainstream. I think there's a lot of embedded C (so general C skills may be useful) but also processor-specific assembly and languages like Ada (perhaps more so for defense avionics).
You are very likely to be targeting a real-time operating system (RTOS) or microcontroller. So knowledge of these may be an advantage. You might need to write device drivers and port them to new platforms (e.g. from one microprocessor to another). You might need to program microcontrollers (e.g. 8051) in assembly or C.
It is likely that you would encounter a much higher stringency in terms of writing and/or using unit-tests, test-harnesses, coverage tools, integration-testing and painstaking formal documentation and review of everything.
Learning C and C++ has already been suggested, and I would also add the Ada programming language to that list. A lot of avionics software is written in those three programming languages.
While learning C/C++, learning how to code properly according to coding standards for aviation software may be helpful, too.
I recommend reading:
If you would like to play around with actual avionics programming, you may be interested in getting an open source quadrocopter (such as the one from AeroQuad) as a toy and experimenting with its software.
I don't work with avionics, but I have worked with remote sensing in the context of Earth Sciences.
I think these materials could be of some help in addition to what others have suggested, esp. if you happen to be interested in the science aspects (sorry the answer may be somewhat off-topic if you are not).
In addition to C, Fortran is still used a lot for implementing various algorithms and models. For smaller tasks and visualisation, people often use Python (numpy, scipy, pandas, matplotlib) and R (R is an excellent statistical programming language, something you would use instead of Excel for serious things).
With regards to C, nobody seems to mention that secure coding is really necessary for such high-stake applications. Seacord, 2013 is a great book for this purpose.
Chapman, Stephen J. Fortran 95/2003 for scientists and engineers. McGraw-Hill, 2008.
Seacord, Robert. Secure Coding in C and C++ (2nd Edition) (SEI Series in Software Engineering). Addison-Wesley Professional, 2013.
Matloff, Norman. Art of R Programming. No Starch Press, 2011.
Good fundamentals in physics are certainly vital in space exploration.
A lot of measurements done in space have to do with radiation, so I'm adding a reference to that.
video lectures by Prof. Walter Lewin (MIT OCW)
Halliday, David, Robert Resnick, and Jearl Walker. Fundamentals of physics extended. John Wiley & Sons, 2010.
Petty, GW. A First Course in Atmospheric Radiation (2nd Ed.). Sundog Publishing, 2006.
Calculus is probably the most important thing, then linear algebra.
Many problems in design and physics have to do with statistics and optimization.
Linear Algebra video lectures by Prof. Gilbert Strang (MIT OCW)
Wilks, DS. Statistical Methods in the Atmospheric Sciences. Academic Press, 2011.
Probabilistic Programming & Bayesian Methods for Hackers (available online)
Kruschke, J. Doing Bayesian Data Analysis, Second Edition: A Tutorial with R, JAGS, and Stan. Academic Press, 2014.
Unix operating systems are used a lot in applied sciences, embedded systems and supercomputers.
Kerrisk, M. The Linux Programming Interface: A Linux and UNIX System Programming Handbook. No Starch Press, 2010.
Lucas, MW. Absolute FreeBSD: The Complete Guide to FreeBSD. No Starch Press, 2007.
many other books, e.g. ones published by O'Reilly
Some daily reading: phys.org/space-news/ (-;
I highly suggest looking into a software analysis course and learning a proving system such as PVS. I went back to graduate school after 14 years in various software industries, and the software analysis course I took has easily been the most eye opening. It wouldn't have made much sense when I was in school, but after working for many years the material clicked. It was never a subject I felt I would enjoy, and it can be a bit dry, but once you get it, you'll never look at programming quite the same way,
From a little search on the net I have found this book: Developing Safety Critical Software: A practical guide fro Aviation Software - Rierson.