University student seeking a mentor of sorts...

kevineugenius

[H]ard|Gawd
Joined
Dec 9, 2006
Messages
1,415
Or maybe more than one. Basically, here at the UW (Washington) I'm entering my junior year and I've had 3 quarters of Java and that's pretty much it. I've played with Python, HTML, SQL, PHP, and Basic on my own. We are going to get, starting now, C and we're using SAGE Math which is Python so there will be a bit of that.

What I have the hardest time with is getting languages set up... Like, with Java being my first language, I didn't know what compiling meant. No one explained it either, they just say things like "Oh you need an editor and a compiler." Sure, it's true, but it's not necessarily helpful. Now I am having that same issue with Python and C. For example, I got IPython and played with it a little and I can get snippets of code to run in IDLE. Cool, but useless. I plan to run Notepad++ unless someone has a good reason to do otherwise, but I sort of am hoping for a step-by-step pure beginner explanation of what software I need to download, how to set it up, and how to make files interact to get results.

This is spawned because we're supposed to use Cygwin for C programming, and I can't make it work. The stupid installer takes about 90 minutes, and every time I go through it I waste a large chunk of time. I don't know Linux command-line, and I don't know what C file types I need and how to make them interact. Cygwin seems to install incorrectly, maybe I need another package (I installed "devel" and everything else is default)?

In essence, it seems like knowing a couple people who understand how to do software development for questions like this would be good because finding code help or finding program suggestions online is easy, but getting help with weird problems or assistance with installations and how the programs actually work seems to be hard to find.
 
The kind of exposure to actual hands on programming scares me and makes me happier with my choice in schools. The school I went to did a much more hands on a approach than what you are getting at UW. The foundation freshmen year was 3 terms of c++ and 1 of assembly. A few digital logic/computer architecture and organization classes. Then the next year we jumped into design patterns,data structs, systems testing, and grammars.

The entire time we coded like mad men in each of the classes in various languages as they tried to expose us to different types.

My suggestion to you is get on your advisor about your path through the degree. A proper school by junior year should have you familiar with linux and windows development fundamentals. It should also have given you enough insight into basic compiler design to understand the problems you are having with setup. I also recommend you pickup a lower level language that is not a garbage collection language.
 
A proper school by junior year should have you familiar with linux and windows development fundamentals. It should also have given you enough insight into basic compiler design to understand the problems you are having with setup. I also recommend you pickup a lower level language that is not a garbage collection language.

I don't necessarily agree on getting familiar with Linux or Windows. It depends largely on what you mean by "A proper school".

I don't know anything really about University of Washington, but based on what I've heard, it has a very traditional CS theory education, which I think is good. Universities like these aren't supposed to be vocational schools. However, I do think it's a little disturbing when I encounter upper level students who still have no clue as to how to properly set up their environment to do their work.

On compiler design, I very much agree on that point. And in fact, I think it should be required for every person who is seriously interested in writing software to build a compiler for a variety of reasons. It can provide a deep understanding of various issues in language design, compiler optimizations, and perhaps, most importantly, language parsing.

kevineugenius, I'm not sure what to tell you since I've never really had any of the problems you're experiencing. I've always managed to use my knowledge of the system and tools to be able to figure things out. Or, if that fails, serious Google-fu. You could always find someone who is willing to help you out with these things, but there will come a day when you need to solve a problem and there is no one to turn to. You'll have to figure it out yourself when that happens.

Your Cygwin issues cannot be addressed here unless you provide much more specific information. If you want to get a better feel for these things, you need to understand the systems and their environments better, which can't really be done without just trying to do things in them or understanding how the system is designed in the first place.
 
I actually got the Cygwin thing working and I agree with you that what UW is giving me is not necessarily the best approach. They do really heavy instruction on the underlying things and how a computer scientist should think without going heavy into the coding aspect (which is fine, I pick up coding pretty fast but you must admit if you think back to before you knew how to do it, setting up your editors, compilers, IDEs, and all that stuff is unlike anything else a normal computer person ever encounters in Windows. For example, I could open notepad, write HTML, save it as .html, and open it... pretty simple. Visual Basic was also pretty simple. In "real" programming languages, it doesn't work that way and no one really has a good way of explaining how to do it). I am really saddened that we don't get any Linux instruction at all, thus the use of Cygwin, though almost every class they say "you should really go learn Linux on your own." That's fine and all, but how am I going to learn Linux if I have nothing to do? That's like saying "go learn how to cook" when you aren't hungry. You can't learn to cook by standing in a kitchen and looking at things and playing with knobs, you need a goal, a set of instructions to get to the goal, and practice at reaching the goal. Anyway, I've de-railed my own topic... lol.

Essentially, I don't understand why instructors and tutorial writers seem to skip step 1. No Cygwin tutorials tell you that you need the gcc package when installing, yet when you go to compile they will say to type 'gcc bla.c'. So, just a resource for filling in a couple blank spots like that is what I'm after.

Another good example is the Google Code Python Class, which I went over during summer break. I followed their step by step to the letter and it didn't work. I figured out how to change their command line instructions so that it did work just with trial and error and good guesswork, but it annoys me greatly when step 1 doesn't work and I have to stare at steps 2-10 wishing I could try them but am unable to because step 1 holds me back.
 
This is a good example. Trying to navigate around in the Python shell (DOS used CD, apparently Linux uses ls, etc) I find this:
Code:
The correct way is to use os.chdir

and everyone seems to agree. The HELPFUL thing to say would be
Code:
import os
os.chdir('thedir/otherdir')
print(os.getcwd())

So, this is what I mean. People say "install Cygwin" when what they really mean is "install Cygwin, download x packages along with it, and put y parameters on the shortcut you use to launch." Yes, I'm in a University so I should be able to figure crap out on my own, bla bla, I know. Should I really spend so much time on trivial things instead of actually doing coursework? Seems lame to me.
 
I'm not sure I believe you 100%. But maybe it's just my experience - I remember having everything laid out in front of me in college & university. Everything was either explained in a book, notes from class, or, as a last resort, one could always use a teacher's assistant as a guide.

Anyways, if you truly are serious about everything, here are a couple of suggestions.

Don't use Cygwin. They tell you to use Cygwin? Don't use it. You're much better off with using a Linux distribution. Scared of Linux? I was 14 and was shuffling Linux distributions left and right. If a teenage boy can learn *nix, you can too. It's not scary. If you don't want to install it on your system, fire it up as a virtual machine. It is very, very easy. It's not any harder than installing Windows. It doesn't dump you in a shell - you're greeted by a GUI just like in Windows.
Do you know basic Windows command prompt commands, such as dir and cd? You're off on a great start with exploring the *nix shell then. A whole bunch of your knowledge you already have transfers over. It's not a completely alien world.

Python shell has nothing to do with a *nix shell. If you launch a Python shell from Windows's command prompt you should have access to -basically- the same programming environment as if you were to launch that shell from a Linux distro. Don't mix the two.

Don't use IDEs if you use any. A lot of confusion comes from those programming abominations. Ok, I might be exaggerating quite a bit with that statement. However, if you don't use them you learn a whole lot more about how an application is built. Once you learn that stuff well enough, go ahead and program in an editor or IDE of your choice. Just don't use an IDE from the beginning, it's not good.

If you don't find examples suitable, look for different ones. Don't be scared of shelling money on your own education either. Buy a good book on whatever language you are learning. Don't settle for the bullshit books that they offer you at the university. I never bough them. Luckily I never needed to. There is plenty of good material out there.

Hope some of the above information helps!
 
I don't necessarily agree on getting familiar with Linux or Windows. It depends largely on what you mean by "A proper school".

I shall clarify a bit more as that was a bit vague. I mean a proper school as in you come out of the program employable and that doesn't work to well at theory heavy schools. The reality of a recent grad is a function tester whether it is hardware or software.

The heavy theory should be kept for graduate school and beyond while a bachelors should be hands on technique imo. A bit of theory isn't bad but I have worked with people as I am a fairly recent graduate that literally could tell you the efficiency on 20 different sorting techniques but couldn't actually code them.

My main point is you are a customer and the university is the seller make sure you get what you are seeking out of it. The school system isn't for everyone so just make sure you get your money's worth.
 
You want a mentor to teach you how to install software? I'm not sure I'm following you.
 
There's a lot of value in figuring out why step 1 may not work in certain tutorials.

I earned my troubleshooting merit badge on figuring out stuff like that through simple tenacity. Knowing how to search or how to ask the right questions goes a long way.

In a class though, the teacher should be able to guide you through any issues you're having.
 
One thing about computer science or computer programming is that you really have to be extremely persistent and stubborn about learning new technologies. Let me explain... No matter how long you do this, or what you know, you'll most likely always need to be learning some new technology or language or fix something that you have no idea how it works initially.

I think a good programmer is usually extremely persistent and diligent, somewhat stubborn. There is always a big initial hill to climb to learn something new, but sooner or later you'll be on the down hill feeling like what was the big deal?

About Cygwin.. all it does is allow you to install a set of packages similar to what you'd have in an Unix environment. The reason they are asking you to do this is so that you have a c++ compiler and other tools like 'make' which allows you to create makefiles which specify commands and dependencies on how to build something. For C/C++ you'll want to look into how to use:

gcc - compiler for C programs.
c++ - compiler for C++ programs, similar to gcc
make - tool usually used to structure build process for programs. Usually you have to compile a few code files, link them together, and certain ones depend on other ones being done first, this is basically a sort of script tool that allows you to specify this so you can just type "make" and it will go through the logic you've put in there. For example, if something depends on another file, it will not compile it unless that file has changed or it's dependency changed, etc.

you can modify your PATH environment variable in windows to point to the cygwin bin folder. I believe I did this on one of my window machines so that all the tools are available for use from any path in the command line. You do not have to use the bash shell (a unix command line equivalent), but you should give it a try sometime. I'm sure you can find a tutorial.

Anyway, did you say you didn't know what a compiler is after 3 years of programming? I'm a bit surprised on this..
 
Last edited:
If you have labs or tutorials with TAs hopefully they can take you through these types of tasks and answer any questions you have. You can also try visiting profs at their office and many of them will be happy to help as well.

You can even call them a mentor if you want.
 
My biggest regret in undergrad was not making better use of the resources available to me.
 
For what it's worth, working through these frustrating problems will likely make you learn things much better. If you don't like solving challenges like this, you might want to consider a different career path.
 
gcc - compiler for C programs.
c++ - compiler for C++ programs, similar to gcc
Did you mean g++?

Anyway, did you say you didn't know what a compiler is after 3 years of programming? I'm a bit surprised on this..
No. He said he's had three quarters of Java. He said he didn't know what a compiler was when he first started using Java.
 
Yeah DeVry was quite similar they focused pretty heavily on programming but skimped on a lot of environmental theory or setup. I'd guess you are suppose to get most of that from your first job but I wouldn't know as I never became a programmer. I got a taste of SQL and never looked back.
 
This thread may have been started during a period of heavy frustration. I want the theory, I want to know what a transistor does, I want to know (mostly) machine/assembly language, I want to know how to set up a programming environment in Linux. At some point we just have to admit that there are more things to learn than there is time to teach in school which is why experienced employees get paid more and get hired more easily.

Basically, when I hit a wall and after 3-6 hours on Google trying to figure something out and having no progress, I think I'd rather just know a couple names who I could ask rather than starting threads that no one else here will find useful.

Also, we don't have any TAs. It's a satellite campus that is supposed to allow for small classes where a TA wouldn't be needed but enrollment is way up this year and they didn't have time to hire new staff or add more classes so class sizes in the good programs, ie the ones I'm in, are about double what they were last year and will probably be that way for at least a year. It definitely sucks and I have and will continue to voice displeasure to the administration though it probably won't do much good. All that being said, I have to stick it out. Maybe I chose a bad school. Tough, that's life. I have to figure out how to get through it and this was an avenue I thought might be helpful.
 
If you want to build a low-level understanding of computers, then learning assembly is the right way to go. Read "Code". And read "Write Great Code: Understanding the Machine". Do projects with embedded controllers, like those Arduino kits.
 
TI want to know what a transistor does, I want to know (mostly) machine/assembly language, I want to know how to set up a programming environment in Linux.

Look through the available courses and see if there is anything which covers these topics, and then... take them. I think it's unlikely they'll teach you how to set up a programming environment, but the other two items should be taught in any decent CS, CE or EE program.

My understanding is that the university of Washington is a very good school. I've worked with several talented people who studied there.
 
We are covering transistors and assembly language but if you want to set up Linux you're on your own, unless the OS class goes hands-on but I got the impression it was more theory as well. I'll find out next year but I definitely plan on figuring out some *nix before then.
 
Ubantu is pretty straight forward, very little learning curve infact.

Having to gets to grips with technology you're never touched before is a fact of life in this field.
 
I've installed Ubuntu a couple times to fiddle around, and a couple other flavors that weren't very impressive. Once I get in there, though, I didn't really have anything I wanted to accomplish so I didn't learn much. It's like opening the hood of the car for no reason other than to look at it... you won't learn a lot unless you start messing with stuff, have a book that tells you what a distributor does (or what a file extension means to extend my poor analogy), etc. When the book, ie Google, doesn't answer my question then I end up here bothering you guys. :D
 
I've installed Ubuntu a couple times to fiddle around, and a couple other flavors that weren't very impressive. Once I get in there, though, I didn't really have anything I wanted to accomplish so I didn't learn much. It's like opening the hood of the car for no reason other than to look at it... you won't learn a lot unless you start messing with stuff, have a book that tells you what a distributor does (or what a file extension means to extend my poor analogy), etc. When the book, ie Google, doesn't answer my question then I end up here bothering you guys. :D

So figure out some stuff you want to accomplish:

  • set up a lamp server (maybe from source)
  • set up a streaming media server
  • build a file server
  • setup rsync for backups
  • build custom backup scripts
  • set it up so it can be your ssh server to tunnel traffic through from anywhere
  • learn cron
  • understand unix/linux permissions and ownership
  • learn shell scripting
  • testbed for learning ruby, python, perl

I could go on
 
Isn't SAGE maintained by UW? I have used it a few times to get functionality similar to Mathematica Notebooks, though eventually it didn't do what I needed for engineering classes. Worked pretty good for other math and visualization though.


As far as programming, I think the initiation rituals involve cutting your teeth in C wrestling with pointers, structs, program flow, and (character) arrays. After that it is a good experience to grab an 8-bit microcontroller datasheet and learn about developing for / fighting within hardware. That tunes you into documentation and understanding it. And in many cases an introduction to errata and working around unfixed bugs.

Returning to your analogy, it is like picking up an older (beater) car that doesn't start and getting it ready for a cross-country trip. If you don't have anywhere in mind to go there might not be much incentive to even get it running, let alone learn enough about it to address all of the problems. Though it might still be worth getting running to sell it back at a profit... /end analogy


I feel that starting with languages that import so much external functionality from the beginning makes it difficult to learn and understand what is really going on 'under the hood'. As far as the real world, having a fresh install of the latest versions of all of these things is unrealistic too, since you are quite likely to get thrown into the mess of deprecated versions that had functionality broken a handful of years ago...

I'm repeating things here, but why are they having you use CygWin as part of your environment? Is there some (proprietary) binary blob you are using in your tool-chain that relies on CygWin? Or some other reason (such as not having source) to not just work with MinGW versions of GCC/G++ and other libraries or a Linux distro with basic development tools installed in a VM?
 
So figure out some stuff you want to accomplish:

  • set up a lamp server (maybe from source)
  • set up a streaming media server
  • build a file server
  • setup rsync for backups
  • build custom backup scripts
  • set it up so it can be your ssh server to tunnel traffic through from anywhere
  • learn cron
  • understand unix/linux permissions and ownership
  • learn shell scripting
  • testbed for learning ruby, python, perl

I could go on

Sorry to necro a thread, but this is actually quite awesome. Thanks!

Things are progressing quite nicely, other than C having some strangeness that Java handles automatically, so I've gotta get those down next.
 
Sorry to necro a thread, but this is actually quite awesome. Thanks!

No prob. How I got into being interested in coding was mostly because of linux, it worked for me but as with anything YMMV.

I wanted a fileserver...didn't want to pay for an OS so I set up a debian box.

Then I realized I had all my music/movies/etc stored only on there so I came up with scripts to back them up to secondary and external storage using rsync so it only backed up the changes/new files.

The I realized I was getting sick of having to transfer movies around or wait for them to transfer/load etc and I wanted to watch them on my TV so I set up the media server. It had some quirks so I built some web based controls for that.

Those were all little projects that I learned a ton from.

I basically shell script and manage script automation (through autosys, not cron) for a company now (amongst some other things, but those are at least 50% of my time).

Good luck and happy projects to you!
 
Back
Top