# Can a physics major get hired as a software engineer?

• Engineering
CyberShot
I'm wondering if I'll be able to find a job once I graduate, if my grad school plans don't pan out. I'm graduating with a BA in physics from a University of California, to be able to take computer science classes on the side (enough for a minor). Am I qualified enough to get software engineering jobs? Will preference be given toward actual computer science majors? Will the fact that I have a BA instead of BS hurt me?

fss
I'm wondering if I'll be able to find a job once I graduate, if my grad school plans don't pan out. I'm graduating with a BA in physics from a University of California, to be able to take computer science classes on the side (enough for a minor). Am I qualified enough to get software engineering jobs?

Probably not, but honestly we have no way of knowing. You will start out at a disadvantage compared to computer science people who have demonstrated programming ability, and it will be up to you to decide how best to show that you can bring something to the table that would make up for this deficiency (real or perceived).

twofish-quant
I'm wondering if I'll be able to find a job once I graduate, if my grad school plans don't pan out. I'm graduating with a BA in physics from a University of California, to be able to take computer science classes on the side (enough for a minor). Am I qualified enough to get software engineering jobs?

Probably not. If you just take a few computer science classes, that's likely not enough for you to get a programming position. If you became as obsessed about computers the same way some people are obsessed with football, then you've got a shot.

Also, try to get an internship at a software company. It also helps if you do something useful. Taking classes is going to be less impressive than haven't an app on Android market or writing a driver for the linux kernel.

Will preference be given toward actual computer science majors? Will the fact that I have a BA instead of BS hurt me?

Software engineering is something in which degrees and coursework don't matter much, but that can hurt you because if you have some computer science classes, but can't program it's not going to help you.

Also, a lot depends on the general economy. When I entered the software in 1998, we were in the middle of the dot-com boom, so they were picking random people off the streets. The market is much tougher now, and who knows what it is going to be like in two years.

CyberShot
That's strange. I've always heard from professors that physicists are usually the best programmers out there.

Nevertheless, would any of you guys recommend software engineering as a short-term career (3-4 years) before getting back to grad school? How's the lifestyle?

twofish-quant
That's strange. I've always heard from professors that physicists are usually the best programmers out there.

There are people with physics degrees that are world class programmers. There are also people with physics degrees that can't program worth a darn.

Brian May is an astrophysicist that is a world class rock guitarist, but it would be bad to conclude from that astrophysicists make great rock guitarists.

Also we can continue the analogy a bit. Being a rock guitarist and being a programmer is something for which formal credentials don't count for much. If I'm hiring a guitarist, I hand them a guitar and watch them play, and whether they have a music degree is pretty much irrelevant. Technical programming interviews work the same way.

Nevertheless, would any of you guys recommend software engineering as a short-term career (3-4 years) before getting back to grad school? How's the lifestyle?

No. Once you leave it becomes extremely difficult to go back.

That's strange. I've always heard from professors that physicists are usually the best programmers out there.

Nevertheless, would any of you guys recommend software engineering as a short-term career (3-4 years) before getting back to grad school? How's the lifestyle?

I can tell you from experience that programming is not something that you take a few classes in. You need to really breathe it, pretty much like anyone that wants to become good at it.

The big thing is getting your hands dirty. There is no substitute for it, and for me personally I started in high school and it took me years to get even quarter decent enough so that I could just grab interrupt tables, and API's so that I could write something that was actually "useful" (i.e not 100 line programs of the hello world invariant).

Now it might take you less time to get to that stage, but if you add in all the domain crap and the whole kit and kaboodle that they don't teach you in a few classes, it really does add up and it takes a lot of time to not only learn it all, but to put it into context.

If you want to get an idea of what dev work is like, get a large platform of some sort (over 100,000 lines of code) and then try and understand it and make some minor modifications. If it takes you way to long to understand it, then that will be a good indicator of how you could measure how much effort you need to put in. It's not the be all and end all indicator, but it's a good metric to start off with.

This is basically the kind of thing that is expected of you in a job. You might have the luxury later of having built up your expertise in a particular platform that your work involves, and as such, the amount of learning will most likely decrease (in terms of intensity), but that usually takes a long time because most software is pretty complex these days.

Shaun_W
It depends on your software engineering skills. People with all sorts of degrees end up in software engineering, although unsurprisingly many people with good programming skills will be drawn towards computer science degrees.

AVReidy
It's kind of insulting how physics majors think learning physics and a bit of programming makes them qualified for a good programming job. If you majored in physics, do something with physics. Don't think you can just grab a job as a programmer to make more money than a physics teacher would.

Software companies usually like people who are very good at and specialize in software engineering. Not people who think they can be hired and use their physics background as an excuse.

Gold Member
It's kind of insulting how physics majors think learning physics and a bit of programming makes them qualified for a good programming job. If you majored in physics, do something with physics. Don't think you can just grab a job as a programmer to make more money than a physics teacher would.

I don't think that programmers being "insulted" is really a valid showstopper for someone who wants to be programmer. What is this? The caste system? :tongue:

FourierFaux
It's kind of insulting how physics majors think learning physics and a bit of programming makes them qualified for a good programming job.
--AVReidy

You're absolutely correct. Learning physics and doing a bit of programming is insufficient.

I can tell you from experience that programming is not something that you take a few classes in. You need to really breathe it, pretty much like anyone that wants to become good at it.
--chiro

Gold Member
--AVReidy

You're absolutely correct. Learning physics and doing a bit of programming is insufficient.

--chiro
Insufficient for what? Can he get a job? Absolutely!

Astro_Dude
I program all the time as part of my astrophysics research. As such, the most call backs I've gotten for jobs involve lots and lots of coding. One such call back outright told me they don't like hiring "only computer scientists" because they "don't know the math as well" and "want diversity".

It all depends on what exactly the job is, really. If you're talking about wanting to be a software engineer for some sort of gaming company, than no. If you're talking about doing software engineering that requires high level math/science skills, then yes.

Ryker
That's terrifying. I wrote a solution to that FizzBuzz problem in literally 30 seconds.

Then again, I guess if you don't know modular math, as I suspect most CSCI majors don't, than it would be quite difficult.
That HAS to be exaggeration. I fully agree with you that it shouldn't take much more than 30 seconds for writing up the solution to that problem, and I really doubt the majority of comp sci majors would fail in doing so. You don't even need to know modular math for this, you just need to know that "divisible by" means that when you divide by that number, the remainder is zero. That's lower year elementary school maths.

Astro_Dude
I hope it's an exaggeration, but I have had *several* college students ask me to add. That is not an exaggeration, and I have asked for clarification every time. Every time the student is embarrassed, but reveals that they don't know how to put two numbers together without a calculator.

FourierFaux
Insufficient for what? Can he get a job? Absolutely!
--DaveC426913

What I meant was that it's a question of how much you actually know. Just being able to write a toy problem here and there shouldn't be enough to get a job. (Is this wrong?)

Solution to proposed FizzBuzz in c:
-------------------------
Code:
#include <stdio.h>

main()
{
int i;

for(i=1;i<101;i++)
{
if(i%3==0)
{
printf("Fizz \n");
}
else if(i%5==0)
{
printf("FizzBuzz \n");
}
else
{
printf("%i \n",i);
}
}
}
-------------------------

:) :) :)

Last edited:
CyberShot
--DaveC426913

What I meant was that it's a question of how much you actually know. Just being able to write a toy problem here and there shouldn't be enough to get a job. (Is this wrong?)

Solution to proposed FizzBuzz in c:
-------------------------
Code:
#include <stdio.h>

main()
{
int i;

for(i=1;i<101;i++)
{
if(i%3==0)
{
printf("Fizz \n");
}
else if(i%5==0)
{
printf("FizzBuzz \n");
}
else
{
printf("%i \n",i);
}
}
}
-------------------------

:) :) :)

Except that's wrong. You're supposed to print "Buzz" if i%5 == 0. and "FizzBuzz" in i%3==0 && i%5 == 0 else if statement. Finally, in the else statement there should be a printf(%i)

Gold Member
My undergrad was in physics, my grad study is in computational neuroscience. A lot of my research training was in signal analysis processing, programming with Matlab (computational physics). I've also taken java classes and lately become interested in Python in my spare time.

But here's the thing. I hate linux. I hate how much trouble I have to go through to install flash or install my wireless drivers (acer travelmates have a hardware button to enable the wireless, it's tough to find the drivers for this button, and when I do, they're not easy to implement.)

On the other hand, I'm currently writing a MATLAB GUI for a biology group so they can analyze their data more intuitively and efficiently. I have to consider all the user slip-ups that can happen, while transforming their thoughts into actions.

I kind of want to learn C++ now.

So, all you pretentious computer scientists out there, what's a basic program challenge (or set of challenges) that's a good test of a programmer's ability?

My undergrad was in physics, my grad study is in computational neuroscience. A lot of my research training was in signal analysis processing, programming with Matlab (computational physics). I've also taken java classes and lately become interested in Python in my spare time.

But here's the thing. I hate linux. I hate how much trouble I have to go through to install flash or install my wireless drivers (acer travelmates have a hardware button to enable the wireless, it's tough to find the drivers for this button, and when I do, they're not easy to implement.)

On the other hand, I'm currently writing a MATLAB GUI for a biology group so they can analyze their data more intuitively and efficiently. I have to consider all the user slip-ups that can happen, while transforming their thoughts into actions.

I kind of want to learn C++ now.

So, all you pretentious computer scientists out there, what's a basic program challenge (or set of challenges) that's a good test of a programmer's ability?

I say this commonly to people that ask your question, and I will not deviate much from previous answers.

If you want to develop your ability as a programmer in a multitude of ways and to develop the perspectives that help you understood each aspect, then pick a domain and an established platform and take it from there.

The fact that you are already writing code means you know the basics of procedural (and as you have demonstrated, event based) programming.

So given that you want to learn C++ and develop more as a programmer, its good to find a platform that is complex and complete, yet structurally intact so as to provide a good basis to learn from a good code repository.

In terms of the language aspects of C++, I feel you will pick these up quickly since you have experience with procedural languages. The two main concepts in programming are state and flow control. When you realize the flow control that happens in C++ in a procedural way, everything should click for you and make sense. If you do work with say multiple threads or processes, then again you will have to revise your thinking about flow control and how that interacts with the state of the machine, but I think you will again have no trouble of doing so.

So once you have a domain, then you can look for some repositories. If you don't find repositories that meet all your needs, then look for smaller ones and try and combine them together in a meaningful way that will help you do what you need to do. The ability to combine multiple libraries together is a very important skill because in terms of modern day development, this is what you do: people can't afford to reinvent the wheel and its a common egotistical attitude among young programmers to create everything from scratch: this doesn't go well when you need to develop something quick.

In terms of linux, you don't need linux to be a developer. The windows platform offers a good API with a tonne of different functions for a wide variety of things and if you want to develop multi-platform software, then its easy to use compiler directives and some good interface design to abstract all the boring crap out to some platform API call (like for example opening files, starting threads, allocating memory, and so on).

In terms of programming ability, I want to mention a few things.

I think of two types of intelligence: there's generic intelligence and there is domain intelligence.

Tonnes of programming requires a generic set of experience and knowledge that allows you to automatically solve a standard problem. For example things like searching, sorting, storing things for both speedy access and low memory requirements are generic problems that apply to many situations. Typically if you do a lot of development you come into situations where you are using these patterns routinely.

The other is domain intelligence. Domain intelligence has to do with the area and the specifics of that area in relation to development work. For example someone working on an operating system would probably know about bin-packing techniques for memory allocation schemes, but someone spending their time doing high level database work probably won't. This is the knowledge that you will get by working with and extending code in your domain. It might consist of knowing some intricate detail about math libraries, or GUI code for doing specific UI functionality, or otherwise.

On top of that you have the other things like not only writing good code yourself, but the ability to read other people's code (which can be a nightmare). Documentation is a big thing as well.

If you want to know more, it's probably going to be easier for you to get your hands dirty. In terms of a book on C++ Bruce Eckel's book comes to mind:

http://www.ibiblio.org/pub/docs/books/eckel/

It's free and its comprehensive. There's plenty of resources out there that address specific issues but none the less, I used this back in the day ;)

I know I haven't given you a "specific" challenge, but I think the exercise of picking a domain, getting some good solid code that has been in development for an extended amount of time, and getting your hands dirty will provide you a challenge in every single area (including the ones I mentioned above), and there is no substitute for that. You will learn and you will learn very quickly.

God speed my friend.

Gold Member
Wow, thanks for a thoughtful reply.

My Domain is scientific programming still, the only other thing I'd ever program is a video game (which is an unrealistic dream at this point) so my domains are likely:

-data streaming (and analysis)
-visualization of data
-networking (being able to share data and analysis results in a standard way with the community).
-but most important to me: making programs intuitive, the user interface.

More specifically about the science, I'm interested in complex systems and nonlinear dynamics, which means i also have to be very away of floating point errors (since they are dramaticized in chaotic systems).

CyberShot
My undergrad was in physics, my grad study is in computational neuroscience. A lot of my research training was in signal analysis processing, programming with Matlab (computational physics). I've also taken java classes and lately become interested in Python in my spare time.

But here's the thing. I hate linux. I hate how much trouble I have to go through to install flash or install my wireless drivers (acer travelmates have a hardware button to enable the wireless, it's tough to find the drivers for this button, and when I do, they're not easy to implement.)

On the other hand, I'm currently writing a MATLAB GUI for a biology group so they can analyze their data more intuitively and efficiently. I have to consider all the user slip-ups that can happen, while transforming their thoughts into actions.

I kind of want to learn C++ now.

So, all you pretentious computer scientists out there, what's a basic program challenge (or set of challenges) that's a good test of a programmer's ability?

Comp Neuroscience? That's really awesome and something I'm still considering. I actually have a couple of questions about that if you don't mind.

1.) Are comp. neuroscience phd programs part of the Neuroscience department or Computer Science/Artificial Intelligence? do you feel as if you're in a grad biology or computer science program?

2.) Is part of your research considered artificial intelligence? Or is it more geared toward biology of the brain? Also, is there a lot of math/statistics involved? I would assume a lot of probability or maybe even combinatorics? (possible different neural pathways/etc)

3.) Do you really have to do a lot of programming? A lot about neural nets I assume? Do you get to actually program "autonomous machines?" Is most of your time spent on computers doing simulations or more in a chemistry lab type environment?

4.) How many programs offer the comp. neuroscience PhD? Are they very hard to get into? What are the prestigious ones? Do you really love your research?

5.) And lastly, did you have to take classes on the side as well as your physics major? Surely, just physics courses wouldn't cut it for a comp. neuroscience program, right? What about programming pre'reqs? Or maybe chemistry/orgo/bio?

Appreciate it.

FourierFaux
Except that's wrong. You're supposed to print "Buzz" if i%5 == 0. and "FizzBuzz" in i%3==0 && i%5 == 0 else if statement. Finally, in the else statement there should be a printf(%i)
--CyberShot

Heh, you're right. I didn't read those last two sentences correctly. Not one of my more impressive moments. :P

Code:
#include <stdio.h>

main()
{
int i;

for(i=1;i<101;i++)
{
if(i%3==0)
{
printf("Fizz \n");
}
else if(i%5==0)
{
printf("Buzz \n");
}
else if(i%3==0 && i%5==0)
{
printf("FizzBuzz \n");
}
else
{
printf("%i \n",i);
}
}
}

Yuqing
--CyberShot

Heh, you're right. I didn't read those last two sentences correctly. Not one of my more impressive moments. :P

Code:
#include <stdio.h>

main()
{
int i;

for(i=1;i<101;i++)
{
if(i%3==0)
{
printf("Fizz \n");
}
else if(i%5==0)
{
printf("Buzz \n");
}
else if(i%3==0 && i%5==0)
{
printf("FizzBuzz \n");
}
else
{
printf("%i \n",i);
}
}
}

This program is equivalent to the first one you posted. The third if clause will never be reached.

FourierFaux
So switching the order of the first and the third clauses in the statement will fix that. But it's too late to impress the interviewer. That's a problem with writing something without compiling it first.

Ryker
So switching the order of the first and the third clauses in the statement will fix that. But it's too late to impress the interviewer. That's a problem with writing something without compiling it first.

CyberShot
--CyberShot

Heh, you're right. I didn't read those last two sentences correctly. Not one of my more impressive moments. :P

Code:
#include <stdio.h>

main()
{
int i;

for(i=1;i<101;i++)
{

if(i%3==0){

if(i%5==0)
{
printf("FizzBuzz \n");
}

else   {
printf("Fizz" \n)
}

}

if(i%5 ==0){
printf("Buzz");
}

else
{
printf("%i \n",i);
}
}
}

I fixed it up.

There should be 3 main conditions, and at least one of them must have a double condition; here, the first one; though, you could just as well have made the second condition have a double condition.

Don't want to get too offtopic here, though..

My Domain is scientific programming still, the only other thing I'd ever program is a video game (which is an unrealistic dream at this point) so my domains are likely:

I used to do this and it took me long hours of personal and group development to be useful in a short time frame.

-data streaming (and analysis)
-visualization of data
-networking (being able to share data and analysis results in a standard way with the community).
-but most important to me: making programs intuitive, the user interface.

In terms of visualization of data, I am assuming you mean things like two and three dimensional plots of some sort and the ability to transform these in ways of viewing angle, scaling, and so on. I will also add physical modelling of geometric data just to be safe.

In terms of understanding this at a deep level, its best to start with the basic of 3d modelling with areas of linear transforms and using those to create a framework with local models, world space, and camera models. You'll find nowadays that most of this is done with a few API calls to OpenGL or DirectX, whereas you had to do everything (and I mean literally everything) using super fast assembler routines or using bare bone C.

If you are dealing with a relatively small amount of data, it's probably useful to just use your graphics card z-buffer. If the geometry is really large, then you need to study spatial classification algorithms and how they are used in hidden surface removal.

For standard modelling where there are no fancy textures or lighting, you will able to set up the video card (again with OpenGL or DirectX) pretty quickly.

With regard to data analysis and data streaming, this will obvious depend on the type and the source of the data, which will dictate the tools that you will use. For example if its some kind of ODBC data source, then you will get an API and libraries for this so you can effectively import the data and then convert it to your data structure for processing.

In terms of streaming, between components of your program, if data is shared specifically in the process space, it will be a lot easier. If your data though is being shared between processes, then you will have to learn about objects like pipes where processes can share public data with each other.

In terms of networking, it's a good idea to see what application protocols are out there, because chances are the protocol's development had the same goal in mind as yourself. It may not be specifically written in mind for your domain, but chances are a lot of the ideas are directly related. As an example think about peer 2 peer software. When most people think of p2p they think of file sharing, but p2p is also used in video broadcast servers (I'm using one for a distance course on Bayesian Inference). So in this example you have the framework for p2p, and then the specific customization for the application you have in mind.

With regards to that comment I would look at the basics of a good p2p protocol and then think about the data structures you need in your application and use both of those as well as specific protocols that you need as a basis for designing a network platform for your application.

More specifically about the science, I'm interested in complex systems and nonlinear dynamics, which means i also have to be very away of floating point errors (since they are dramaticized in chaotic systems).[/QUOTE]

As for intuitive interfaces, that is a real ***** of a subject. For anything involving navigation through visualizations (in other words through a 3D virtual world or representation of some sort), you will need both a visualization system that has very specific control over the rendering and the detection of objects in the world. Typically we use the term "hit test" for the ability to cast a ray and return the object that was first hit.

Coding the basics for that requires collision detection. If you don't have many objects, then you could get away with something simpler, but if the complexity of your visualization grows, then you will need something more versatile.

One integrated way for interactive visualization is based on what games like Doom 3 do: they dynamically create a texture (think bitmap) and then they render that to some object. So in other words you create a flat quadrilateral with two triangles, then you create your output texture by computing it based on the representation and events executed by the user (user moves mouse, clicks on button, etc), and then using the output texture as the texture for your quadrilateral.

In the above scenario, the whole system is unified under a general 3D visualization engine. With this you could have many 2D interfaces within a 3D virtual world and you could give the interfaces all the fancy stuff that you see in your state of the art PC games because everything goes through the same pipeline, so you get everything from transparency to texture effects for free.

But doing this takes a lot of work (and I know from experience).

If you ever want to get into video games, the key things is finding the balance between flexibility and performance and nowadays you need high amounts of both. The performance criteria means that optimization is very important and understanding this in a variety of contexts from computation time to general playability. Hardware is getting better and better, but as a consequence, people want more and more detail and fireworks which means finding solutions that scale is critical.

So with some game engine, the important point is the ability to create content quickly and use it quickly. As a result of this game engines have their own scripting languages, geometry exporters, and numerous tools to create the worlds, network protocols, user interfaces, and game specific code, which are designed to be flexible and easy to get something up and running.

It can be a nightmare in a lot of ways, but having a finished game is pretty cool.

Gold Member
1.) Are comp. neuroscience phd programs part of the Neuroscience department or Computer Science/Artificial Intelligence? do you feel as if you're in a grad biology or computer science program?

2.) Is part of your research considered artificial intelligence? Or is it more geared toward biology of the brain? Also, is there a lot of math/statistics involved? I would assume a lot of probability or maybe even combinatorics? (possible different neural pathways/etc)

3.) Do you really have to do a lot of programming? A lot about neural nets I assume? Do you get to actually program "autonomous machines?" Is most of your time spent on computers doing simulations or more in a chemistry lab type environment?

4.) How many programs offer the comp. neuroscience PhD? Are they very hard to get into? What are the prestigious ones? Do you really love your research?

5.) And lastly, did you have to take classes on the side as well as your physics major? Surely, just physics courses wouldn't cut it for a comp. neuroscience program, right? What about programming pre'reqs? Or maybe chemistry/orgo/bio?

Appreciate it.

1) I can't tell you for sure about the culture. In my case, there is no such program in my location, but we have all the components, so I have designed my thesis and am trying to bring together the dynamical systems group in the physics department and the neuroethologists in the neuroscience program. The PI's in the neuroscience department appear interested and I feel that my thesis can tell a better story from with an evolutionary and physiological motivation.

2) My impression is that it's most definitately not stereotypical. I really don't see many computer science based people in it. I see lots of physicsists. But I come from it from the dynamical systems point of view: I'm modeling large systems of differential equations that obey physiological (and physical) electrochemistry laws to reproduce neural behavior. I'm not modeling the typical 1's and 0's artificial network.

3) no, no, I am, more or less training as a theoretical physicist in nonlinear dynamics tackling neuroscience problems. It's just that you can't solve these problems on pencil and paper. The difficulty then, is not only solving them geometrically, but displaying the solutions in a way that you can understand for a system that has more dimensions than is easy to visualize.

But I do also have experience playing with real world data from my undergrad (and still, for money work that job). So now I'm beginning to use those skills to work with the experimental neuroethologists (it's like live data mining!)

4) They look kind of prestigious to me, most that I've found (my dream placement for PhD is Brain-Mind institute in Laussane Switzeland at school of life sciences) but if you just google "computational neuroscience Phd programs" you'll probably notice they're a lot of top tier schools. Which makes sense, I guess, it's theoretical so these schools had to have extra money to seed new research, it's always a risk. I really want to just start the program in my location, but it's definitely a smarter move to get my PhD outside then come back.

I absolutely love my research, though I don't know if I'll get into any PhD programs. Like I said, I'd really just like to find my niche here, because all the components are here, somebody just has to put them together.

5) yes, I took two graduate level neuroscience courses and some programming and a nonlinear dynamics course.

Last edited:
Fra
Some ideas to the OP:

It seems you are unsure of what you want and are interested in? This is hard for anyone to advice on.

But indeed I can see plenty of crossings between computer science and many natural science disciplines. These days, all but the most trivial modells require numerical methods in order to actually computer the predictions. This is in physics, biology and biochemistry.

One extremely interesting, and I think nice for the future is modelling organism responses accounting for gene expression and other regulations. The point with complex systems is that even if it "in principle" if you look at the model, is determinisic, complexity and rounding errors prevents this from actually beeing predictive. So instead of modelling from dynamical first principles the molecular chemistry of an organism, one can do metabolic network modelling of the pathways, just using the metabolic pathways as a constraint and then assume that the regulatory states optimize stuff like growth rate and survival. I think this type of modelling is done a lot when studying microbes and cellular responses to medication.
http://en.wikipedia.org/wiki/Metabolic_network_modelling

I didn't actually work with this but I briefly studied such models for yeast and E coli as part of private research.

In particular the de facto limited predictions of complex systems due to chaos, rounding errors etc really forces you to think beyond the microscopic laws, since these really do loose their predictive value once you scale out, and new rules emerge. And it also gives insight into the action of such systems in statistical terms, and gives an inside view to complex systems.

Even when you look at fundamental physics, unification and stuff like that, information bounds etc. One realizes that practical things like finite resolution of a computation, really is something more than just practical issues, since physis constraints the possible resolution.

If you really want to, there seems to be plenty of opportunities to crossbreed physics and computer science. A good skill would be to know to be able to implement any of the above from scratch in a programming language of choice. At least where I am, any physics master typically have studied also programming knowing one or two programming languages (which chances with faishon, I myself did pascal and then c and c++) and one or two courses in numercial analysis, learning how to numerically solve ode's or also pde's. It's an extra satisfaction to write your own routines, rather than use prepackaged software. Or at least to konw that you CAN do it (if you only bother and have the time). We even had "numerical labs" in classical mechanics courses, where we were about to solve numerically Newtons equations for a non-trivial system, such as many body problem or something that lacks analytical solutions, and then "discuss the results". A prerequsite for that classical mechanics cours was the first year of programming though. (pascal or c). But I think it varies from school to school.

/Fredrik

Gold Member
In terms of visualization of data, I am assuming you mean things like two and three dimensional plots of some sort and the ability to transform these in ways of viewing angle, scaling, and so on. I will also add physical modelling of geometric data just to be safe.

In terms of understanding this at a deep level, its best to start with the basic of 3d modelling with areas of linear transforms and using those to create a framework with local models, world space, and camera models. You'll find nowadays that most of this is done with a few API calls to OpenGL or DirectX, whereas you had to do everything (and I mean literally everything) using super fast assembler routines or using bare bone C.

If you are dealing with a relatively small amount of data, it's probably useful to just use your graphics card z-buffer. If the geometry is really large, then you need to study spatial classification algorithms and how they are used in hidden surface removal.

For standard modelling where there are no fancy textures or lighting, you will able to set up the video card (again with OpenGL or DirectX) pretty quickly.

With regard to data analysis and data streaming, this will obvious depend on the type and the source of the data, which will dictate the tools that you will use. For example if its some kind of ODBC data source, then you will get an API and libraries for this so you can effectively import the data and then convert it to your data structure for processing.

In terms of streaming, between components of your program, if data is shared specifically in the process space, it will be a lot easier. If your data though is being shared between processes, then you will have to learn about objects like pipes where processes can share public data with each other.

In terms of networking, it's a good idea to see what application protocols are out there, because chances are the protocol's development had the same goal in mind as yourself. It may not be specifically written in mind for your domain, but chances are a lot of the ideas are directly related. As an example think about peer 2 peer software. When most people think of p2p they think of file sharing, but p2p is also used in video broadcast servers (I'm using one for a distance course on Bayesian Inference). So in this example you have the framework for p2p, and then the specific customization for the application you have in mind.

With regards to that comment I would look at the basics of a good p2p protocol and then think about the data structures you need in your application and use both of those as well as specific protocols that you need as a basis for designing a network platform for your application.

More specifically about the science, I'm interested in complex systems and nonlinear dynamics, which means i also have to be very away of floating point errors (since they are dramaticized in chaotic systems).

As for intuitive interfaces, that is a real ***** of a subject. For anything involving navigation through visualizations (in other words through a 3D virtual world or representation of some sort), you will need both a visualization system that has very specific control over the rendering and the detection of objects in the world. Typically we use the term "hit test" for the ability to cast a ray and return the object that was first hit.

Coding the basics for that requires collision detection. If you don't have many objects, then you could get away with something simpler, but if the complexity of your visualization grows, then you will need something more versatile.

One integrated way for interactive visualization is based on what games like Doom 3 do: they dynamically create a texture (think bitmap) and then they render that to some object. So in other words you create a flat quadrilateral with two triangles, then you create your output texture by computing it based on the representation and events executed by the user (user moves mouse, clicks on button, etc), and then using the output texture as the texture for your quadrilateral.

In the above scenario, the whole system is unified under a general 3D visualization engine. With this you could have many 2D interfaces within a 3D virtual world and you could give the interfaces all the fancy stuff that you see in your state of the art PC games because everything goes through the same pipeline, so you get everything from transparency to texture effects for free.

But doing this takes a lot of work (and I know from experience).

If you ever want to get into video games, the key things is finding the balance between flexibility and performance and nowadays you need high amounts of both. The performance criteria means that optimization is very important and understanding this in a variety of contexts from computation time to general playability. Hardware is getting better and better, but as a consequence, people want more and more detail and fireworks which means finding solutions that scale is critical.

So with some game engine, the important point is the ability to create content quickly and use it quickly. As a result of this game engines have their own scripting languages, geometry exporters, and numerous tools to create the worlds, network protocols, user interfaces, and game specific code, which are designed to be flexible and easy to get something up and running.

It can be a nightmare in a lot of ways, but having a finished game is pretty cool.

Wow, that's a lot of information to digest for one post!

For visualizing data, we're talking hundreds of dimensions (sometimes thousands). So it actually takes some novel approaches if you want to know what the phase space looks like. Using MATLAB, I've actually made myself proud a few times.

I'm very interested in innovation when it comes to this subject. Scaling and transforming are rather easy operations in Matlab. It's coming up with a novel idea in the first place, regardless of what language I'm using, that is the interesting, fun, and useful part.

It will probably be a long time before I ever try to actually write a game. But I don't imagine myself writing a first-person shooter or anything. It would more like a god-mode or RTS or just objects on the screen to play with (like fantastic contraptions) or Insaniquariam, where you have simple game mechanics.

fizziks
I have a BA in physics. Ended up with a programmer position after graduation. Then I just continued that route with a MS in comp eng.

You don't really need a degree to prove that you're a good programmer. I took one C++ class during my physics studies and ended uP doing personal projects. Some of them mixing in my Physics.

twofish-quant
One extremely interesting, and I think nice for the future is modelling organism responses accounting for gene expression and other regulations. The point with complex systems is that even if it "in principle" if you look at the model, is determinisic, complexity and rounding errors prevents this from actually beeing predictive.

And then you can use the same math to model financial systems.

http://www.nature.com/nature/journal/v469/n7330/full/nature09659.html

http://www-thphys.physics.ox.ac.uk/colleges/merton/notes/may.pdf

Last edited by a moderator:
Fra
And then you can use the same math to model financial systems.

Yes indeed, there are many conceptual analogies. In fact some of the core problems of mathematical formalisms in fundamental questions in current physics, in particular the gaming perspectives and the inference perspectives are quite generic - and ones understood, would have wide ranges of applications, not just physics.

In economical and social systems, some issues might even be more obvious than in physics, sometime I'm mentioned in a few threads. Smolins "sidekick" Roberto Unger who is an expert in social theory and law have actually provided several deep insights and comments on the nature of law (in the context of smolings evolution of physical law) in a joint talk at perimeter.

So I think that there may even by mutual benefits of fields, by getting some experience in other fields. Certainly the abstract "modelling and inference problem" are very similar for someone looking to placet their bets in a market that is completely determined by expectations and where the notion of fundamental values are ambigous at best (here I compare to fundamental DOFs)

/Fredrik

twofish-quant
In economical and social systems, some issues might even be more obvious than in physics, sometime I'm mentioned in a few threads. Smolins "sidekick" Roberto Unger who is an expert in social theory and law have actually provided several deep insights and comments on the nature of law (in the context of smolings evolution of physical law) in a joint talk at perimeter.

The one caveat here is that you have to be very, very, very careful, because it's easy to come up with a theory of finance that is simple, elegant, and totally wrong, and having a theory of finance that is just wrong can cause tremendous damage. Also one thing that physicists are not usually not prepared for is how their ideas can be (sometimes intentionally) misinterpreted or misunderstood. If you come up with a model of credit derivatives that works only under situations X, Y, and Z, people will forget about the limits.

Also, one's mindset has to change a little. In astrophysics, the rules are the same in space and time, whereas in finance, the rules are different from place to place and they can change. This is a good thing for employment because you can be the world's expert about how to mathematically model stock exchange A, but stock exchange B is wildly different because B has a one hour lunch break and A does not.

Certainly the abstract "modelling and inference problem" are very similar for someone looking to placet their bets in a market that is completely determined by expectations and where the notion of fundamental values are ambigous at best (here I compare to fundamental DOFs)

One of the fields that is a huge source of employment for physics Ph.D.'s with a lot of software experience is high frequency trading, and you run into some interesting questions like "what is a price?"

Also for high frequency trading, you assume that expectations and fundamental value doesn't matter. One way of thinking about this is that if you have a stock the reasonable annual return is say 10%/year. Now over the course of 5 seconds, you can approximate the fundamental return to be zero, and the dynamics are going to be overwhelmed by trading noise.

Something is useful in astrophysics and I think in biological systems is to "decouple scale." For example, you would like to look at the cell without thinking about the entire ecology of the rain forest and vice versa, and a lot of time you can do that. So when you do millisecond trading, you don't think about the fundamental value of the corporation, and vice versa, just like you don't think about the whole rain forest when you look at a cell.

But some of the really interesting problems in astrophysics and finance are those in which the scales are not decoupled.