Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
Love Stole the Day
Nov 4, 2012
Please give me free quality professional advice so I can be a baby about it and insult you

Jeffrey of YOSPOS posted:

I do mostly low-level stuff and what I want to see on a resume is experience in systems programming, with examples of projects worked on. From there I can often reason about what sort of thing the person was doing and follow up on it on a phone interview. A combination of being able to talk specifics about your prior projects and what you personally did, and pass (difficult) technical interviews will do it. Sometimes if a company is unsure that you know your stuff they'll have you take an online C++ test or something before bringing you in.

Sure this makes sense for what to do during phone interviews, but I was actually asking about what comes before that point: specifically, what you put on that resume to actually get to that phone interview. Do you just put "C++" on your resume and then you hope that you don't get Black Hole'd so that you can actually talk to a human being about your experience with the language?

Adbot
ADBOT LOVES YOU

Jeffrey of YOSPOS
Dec 22, 2005

GET LOSE, YOU CAN'T COMPARE WITH MY POWERS

Love Stole the Day posted:

Sure this makes sense for what to do during phone interviews, but I was actually asking about what comes before that point: specifically, what you put on that resume to actually get to that phone interview. Do you just put "C++" on your resume and then you hope that you don't get Black Hole'd so that you can actually talk to a human being about your experience with the language?

Talk about projects that you've done using C++ and you can say specifically "in C++" in the description if you'd like. I look for a cluster of related things including not only the language C++ but also low-level computer systems knowledge in general. If I were instead at a game company I might look for game programming projects instead. I don't know how it works at really big companies but our resume screeners read the project descriptions and aren't just looking for keywords.

The Phlegmatist
Nov 24, 2003
C++17 (or whatever you know) rather than C++. Especially don't put C/C++ as a skill on your resume.

Esp. if you're new to the industry, put your github on your resume with a project using some of the libraries I said before so you demonstrate that you can work with other people's code (they are way way better implemented than half the poo poo you will find in production but eh.) I'm not in charge of hiring but generally people get in because they could demonstrate C++ knowledge; C++ is a gigantic hell language so you're not expected to know all of it nor all of the third-party libraries. You're expected to know how to use it though and a personal project is a good demonstrator of that.

e: also C++ might not be a good choice if you're trying to break into programming as a career regardless. The job market where I am for C++ is pretty dire.

The Phlegmatist fucked around with this message at 15:35 on Dec 19, 2017

Xarn
Jun 26, 2015
I guess it helps if you have previous jobs or stuff you can use, ie I have modern C++ as a skill for people who search for keywords, but my list of experience goes like

- "Modernized university course to teach C++14 and then spent 2 years teaching"
- "2 years of programming soft real time safety critical systems in C++"
- "year of maintaing popular C++ OSS project"
- "year of programming medical software in C++"

... not sure what else would you expect there? 2 years of using Boost?

Volguus
Mar 3, 2009
The only thing I'd say is: I've read the mp11 documentation, I understood it and was able to use it. More than that is just fluff.

go play outside Skyler
Nov 7, 2005


My friend is doing Arduino dev using Embed XCode and a full C++ stack.

Today he called me because he has a problem with the following code:



What happens is the following: when position_1.state == 1, it's like old_position never gets "stored". The output looks like this

code:
    Stat = 1       old Stat = 0
    Stat = 1       old Stat = 0
    Stat = 1       old Stat = 0
    Stat = 1       old Stat = 0
...
However, as soon as position_1.state == 0, 2 or 3, the code works as expected:
code:
    Stat = 2       old Stat = 0
    Stat = 0       old Stat = 2
    Stat = 3       old Stat = 0
old_position is defined as a private variable of the cPosition class, and only one instance of this class exists.

I did a global search for old_position and I can confirm this is the only place that this variable is called.

Would it be possible that some kind of compiler optimisation is doing something weird? Or do I tell my friend to read his code one more time because there is absolutely 100% no way that this is some kind of compiler bug?

MrMoo
Sep 14, 2000

So obvious point would be cPosition being reset before each call.

Volguus
Mar 3, 2009
Is old_position set outside of that if statement? If not ,then that's a problem.

go play outside Skyler
Nov 7, 2005


MrMoo posted:

So obvious point would be cPosition being reset before each call.

Yeah it's one of the first things I looked for. I will look one more time, more carefully.

Volguus posted:

Is old_position set outside of that if statement? If not ,then that's a problem.

No, a global search for a string of "old_position" yielded only 3 results, which are the 3 uses you see in that code. So what do you think?

(This is not the final code, he stripped it down all day trying to isolate the cause and found this odd thing)

go play outside Skyler fucked around with this message at 20:50 on Dec 19, 2017

Volguus
Mar 3, 2009

go play outside Skyler posted:

Yeah it's one of the first things I looked for. I will look one more time, more carefully.


No, a global search for a string of "old_position" yielded only 3 results, which are the 3 uses you see in that code. So what do you think?

(This is not the final code, he stripped it down all day trying to isolate the cause and found this odd thing)

I think that old_position has not been initialized. Initialize it to some value (0?, 1? whatever you think it should be) in the initializer's list or somewhere. The idea is that it should have a known value by the time the first position_1.state != old_position is being done.

baby puzzle
Jun 3, 2011

I'll Sequence your Storm.
I have a C++ question that isn't really a C++ question. I am building a library that is not generating a PDB file for release build. The library is called SFML.

However, I need PDBs or some kind of information because I am trying to debug this crash that has only happened in release builds so far:

code:
		 	sfml-window-2.dll!00007ffb1014c898()	Unknown
		 	sfml-window-2.dll!00007ffb10143cdb()	Unknown
		 	sfml-window-2.dll!00007ffb101464a9()	Unknown
		 	sfml-window-2.dll!00007ffb10146365()	Unknown
		 	sfml-window-2.dll!00007ffb10145921()	Unknown
		>	MyMusic.exe!fakemain(int argc, char * * argv) Line 8713	C++
I can either figure out how to generate a PDB and then attempt to reproduce the crash, or maybe somehow figure out which functions correspond to these addresses? Which course should I take?

I don't know how to make visual studio create a PDB file when I build this library. This really old article tells me it is in "linker" settings, but I don't have linker settings https://blogs.msdn.microsoft.com/yash/2007/10/12/pdb-files-what-are-they-and-how-to-generate-them/

Here's a question and article about how to generate a pdb for a release build, but I don't know what to do with the answers.

https://www.wintellect.com/correctly-creating-native-c-release-build-pdbs/
https://stackoverflow.com/questions/28178978/how-to-generate-pdb-files-for-release-build-with-cmake-flags

It seems like I need to do something with CMake in order to get CMake to create a Visual Studio solution that will create a pdb, but I don't really want to learn anything about CMake right now, or ever.

I dunno you guys. What course do I take in these trying times?

nielsm
Jun 1, 2009



Are you actually using CMake to generate the MSBuild project files for running the build? If not, you shouldn't need to involve another tool for it.

When you open the Properties for the project in VS you should be able to set it up here:

baby puzzle
Jun 3, 2011

I'll Sequence your Storm.
Ok I guess I was literally just looking in the wrong place because I couldn't find that setting yesterday.

Absurd Alhazred
Mar 27, 2010

by Athanatos

baby puzzle posted:

Ok I guess I was literally just looking in the wrong place because I couldn't find that setting yesterday.

To be fair, Visual Studio has a LOOOT of settings. One way to try and navigate it better is to go to "all options" under a heading and use the searchbox, but it's still annoying.

Joda
Apr 24, 2010

When I'm off, I just like to really let go and have fun, y'know?

Fun Shoe
I'm trying to make a wrapper around GLM's datatypes, so I can easily implement conversions to/from various different libraries' vector types, and replace it easily with my own implementation if I want. Is there a way to extend them without having to specify my own operator overloads?

I have
C++ code:
namespace Math {
    struct Vector2f : public glm::fvec2 {

    };
}
But when I try to multiply two Vector2fs and assign it to a new one I get the following error:
code:
conversion from ‘glm::tvec2<float, (glm::precision)0u>’ to non-scalar type ‘Math::Vector2f’ requested
     Vector2f vec3 = vec1*vec2;
I assume because the multiplication operator returns a vec2. I could probably get around this by overloading the = operator, but then what do I do about swizzle? (glm has swizzle operators which is where you can do vector.xyx and it will return a vec3(x, y, x),) but again it will be returning them as vectors. Is there a way to just say "Implement all these operators exactly as they are, but in stead of returning a glm::vec, return my extending type?"

Jabor
Jul 16, 2010

#1 Loser at SpaceChem
You could write an implicit conversion from the glm vectors to your vector type.

But if you're looking to do things like "multiply two vectors from different libraries", you're probably going to have to write that one yourself.

Joda
Apr 24, 2010

When I'm off, I just like to really let go and have fun, y'know?

Fun Shoe
No, I want a vector type that I use for everything that has conversions to/from all other vector types, so I only use that one in my own stuff, then do conversions when I want to interact with a library. It's really just to avoid having to explicitly convert glm vectors to bullet vectors (for instance) by passing each coordinate manually. Also, to make the process easier if I for some reason want to eventually change my basis vector to something else or implement SIMD or something. I did write an assignment operator which seems to have mostly fixed it. Only pain is I have to manually write out all the constructors, but I guess that's to be expected.

Absurd Alhazred
Mar 27, 2010

by Athanatos

Joda posted:

No, I want a vector type that I use for everything that has conversions to/from all other vector types, so I only use that one in my own stuff, then do conversions when I want to interact with a library. It's really just to avoid having to explicitly convert glm vectors to bullet vectors (for instance) by passing each coordinate manually. Also, to make the process easier if I for some reason want to eventually change my basis vector to something else or implement SIMD or something. I did write an assignment operator which seems to have mostly fixed it. Only pain is I have to manually write out all the constructors, but I guess that's to be expected.

If that's what you want then don't have it inherit from glm::vecs, just create implicit conversions, assignments, and such.

Doc Block
Apr 15, 2003
Fun Shoe
Thought maybe it'd be better to ask this here (hope this is OK):

Doc Block posted:

If I'm making a game for Windows and Mac, how sorry am I gonna be later on for manually maintaining the Visual Studio and Xcode projects? It feels like I should use CMake or something to generate them, but on the other hand I won't be distributing the source code, so no need for using CMake to make sure whoever is doing the build is using a compiler that supports all the C++11/14 features used, where they have SDL installed, etc.

I'm aware that I'll have to update both projects every time I added or removed a file, but most of the development is gonna be done on one platform and then just ported to the other, so that shouldn't happen too often. And it seems like using the CMake-generated project files to do the actual development work would be annoying. Maybe keep a separate project for development and use CMake to generate the build systems for building release binaries?

Ideas?

ullerrm
Dec 31, 2012

Oh, the network slogan is true -- "watch FOX and be damned for all eternity!"

Subjunctive posted:

Swift has at times been brutal to work in because of the compatibility breaks and the fact that Xcode can’t span versions. Want to bisect a span that includes a toolchain upgrade? Bring your own bourbon. (Similarly, you need a big flag day where everyone in the company updates to the new version at the same time as the migration diff lands on master.)

That’s a little fast.

+1 for Swift version changes being a pain in the rear end. (Although I'm not sure where to draw the line between "the Swift team made a mistake" and "the Xcode team made a mistake.")

Plus, a substantial amount of Swift is still built on top of ObjC and depends on ObjC interop, and the rules by which that happens are not exactly intuitive. Case in point: God help you if you objc_sync_enter/objc_sync_leave on a Swift string literal

Xerophyte
Mar 17, 2008

This space intentionally left blank
Con: you'll be doing some duplicate build configuration work.
Pro: cmake is a crappy, crufty mess that should be shunned.

Call it even?


More seriously, I think it depends on how complex your build will be. Are you just going build your stuff and link some external binaries? Doing that twice in the native environment is probably less work than setting up something cross platform. Are you going to run some external processes to generate LLVM bytecode that you'll compile into your application to enable runtime linking with your bespoke internal compiler? You may want to a) re-examine the life choices that lead you to this precipice and b) only set that up once.

It also depends on the choices made by your external dependencies, if they have an extensive cmake module then using it can save you a lot of grunt work even on a single platform. I wouldn't want to build against, say, Qt without using their cmake module.

Plorkyeran
Mar 22, 2007

To Escape The Shackles Of The Old Forums, We Must Reject The Tribal Negativity He Endorsed
CMake is a giant pile of poo, but it's still completely fine for simple things and you don't want to be duplicating complex things.

Developing with a cmake-generated Xcode project is completely fine. I've never had it be meaningfully worse than with an artisinal hand-crafted project file. Recent versions of Visual Studio can skip the project file generation completely and just open cmake projects directly.

Subjunctive
Sep 12, 2006

✨sparkle and shine✨

ullerrm posted:

+1 for Swift version changes being a pain in the rear end. (Although I'm not sure where to draw the line between "the Swift team made a mistake" and "the Xcode team made a mistake.")

I think better tooling would have made it much smoother, assuming that the Swift team didn’t prefer the big hits to force people along.

Doc Block
Apr 15, 2003
Fun Shoe

Xerophyte posted:

Con: you'll be doing some duplicate build configuration work.
Pro: cmake is a crappy, crufty mess that should be shunned.

Call it even?


More seriously, I think it depends on how complex your build will be. Are you just going build your stuff and link some external binaries? Doing that twice in the native environment is probably less work than setting up something cross platform. Are you going to run some external processes to generate LLVM bytecode that you'll compile into your application to enable runtime linking with your bespoke internal compiler? You may want to a) re-examine the life choices that lead you to this precipice and b) only set that up once.

It also depends on the choices made by your external dependencies, if they have an extensive cmake module then using it can save you a lot of grunt work even on a single platform. I wouldn't want to build against, say, Qt without using their cmake module.

Yeah, just compiling my code, linking external binaries, and running a script at the end to package up the game assets.

Plorkyeran posted:

Developing with a cmake-generated Xcode project is completely fine. I've never had it be meaningfully worse than with an artisinal hand-crafted project file. Recent versions of Visual Studio can skip the project file generation completely and just open cmake projects directly.

I dislike the way CMake dumps all source code files into one big group. I'm a big baby who makes a bunch of groups and subgroups.

And it seems like it'd be a pain to add a new file if developing with a CMake-generated project file, since you probably have to close the project, create the new file on the command line, add it to CMakeLists.txt, regenerate the Xcode or VS project, and then reopen it.

edit: One possibility is to start out with a regular project file, do most of the development with that, and then convert it to CMake so I'll have a working project to compare CMake's output project against, then do the porting.

Doc Block fucked around with this message at 11:19 on Dec 30, 2017

Joda
Apr 24, 2010

When I'm off, I just like to really let go and have fun, y'know?

Fun Shoe

Doc Block posted:

And it seems like it'd be a pain to add a new file if developing with a CMake-generated project file, since you probably have to close the project, create the new file on the command line, add it to CMakeLists.txt, regenerate the Xcode or VS project, and then reopen it.

edit: One possibility is to start out with a regular project file, do most of the development with that, and then convert it to CMake so I'll have a working project to compare CMake's output project against, then do the porting.

I completely agree that C++ is missing a reasonable, standardized build procedure, and CMake has its flaws, but there are ways to make this process less of a pain in the rear end.

You can have variables hold groups
code:
set(SOURCE_GROUP_1 source1.cpp source2.cpp [...])
set(SOURCE_GROUP_2 source3.cpp source4.cpp [...])
set(PROJECT_SOURCES ${SOURCE_GROUP_1} ${SOURCE_GROUP_2}}
add_executable(TargetName ${PROJECT_SOURCES})
And if you want to automate the process based on what folders the sources are in or a naming convention:
code:
file(GLOB SOURCE_GROUP_1 sourceGroup1/*.cpp) #Adds all .cpp files in sourceGroup1 automatically
file(GLOB SOURCE_GROUP_2 sourceGroup2*.cpp) #Adds all .cpp files prepended with sourceGroup2
set(PROJECT_SOURCES ${SOURCE_GROUP_1} ${SOURCE_GROUP_2}}
add_executable(TargetName ${PROJECT_SOURCES})
As far as I know file(GLOB) will work with any regex.

You can also automate the build file generation either with a bash/python script or with CMAKE GUI, but neither of these are pretty or easy, but it's a one-time setup thing.

Also, CLion has a lot of nice features for making CMake less annoying, like automatically detecting your source groups and asking which variable to add new source files to.

Joda fucked around with this message at 16:27 on Dec 30, 2017

rjmccall
Sep 7, 2007

no worries friend
Fun Shoe

Subjunctive posted:

I think better tooling would have made it much smoother, assuming that the Swift team didn’t prefer the big hits to force people along.

That’s the exact opposite of our perspective: we don’t like there being big hits because it makes it harder for people to keep up.

I think we’ve actually done a pretty good job on the upgrade tooling. It’s just a hard problem because you really, really don’t want to silently break the behavior of code. The 1-to-2 upgrade was awful because the language changes (like error handling) were very difficult to upgrade. The 2-to-3 transition was bad mostly because there were just so many language and SDK changes. But the reason we made all those changes in 3 was to get the language in a more stable state, and that seems to have worked; everything I’ve heard is that the 3-to-4 transition is painless, and that’s likely to be the rule going forward.

Plorkyeran
Mar 22, 2007

To Escape The Shackles Of The Old Forums, We Must Reject The Tribal Negativity He Endorsed

Doc Block posted:

And it seems like it'd be a pain to add a new file if developing with a CMake-generated project file, since you probably have to close the project, create the new file on the command line, add it to CMakeLists.txt, regenerate the Xcode or VS project, and then reopen it.

edit: One possibility is to start out with a regular project file, do most of the development with that, and then convert it to CMake so I'll have a working project to compare CMake's output project against, then do the porting.

No, you just add the new file to CMakeLists.txt and then hit build twice in the IDE. Cmake checks on every build if the project file needs to be regenerated.

Doc Block
Apr 15, 2003
Fun Shoe
edit: never mind, I immediately found out about source_group() after posting this :doh:

Ralith
Jan 12, 2011

I see a ship in the harbor
I can and shall obey
But if it wasn't for your misfortune
I'd be a heavenly person today

Joda posted:

And if you want to automate the process based on what folders the sources are in or a naming convention:
code:
file(GLOB SOURCE_GROUP_1 sourceGroup1/*.cpp) #Adds all .cpp files in sourceGroup1 automatically
file(GLOB SOURCE_GROUP_2 sourceGroup2*.cpp) #Adds all .cpp files prepended with sourceGroup2
set(PROJECT_SOURCES ${SOURCE_GROUP_1} ${SOURCE_GROUP_2}}
add_executable(TargetName ${PROJECT_SOURCES})
As far as I know file(GLOB) will work with any regex.
Do not do this. The build system won't be able to automatically tell when you've added new files and your collaborators (or even you yourself) will constantly hit build failures because they forgot to rerun cmake by hand. Always list source files explicitly in your build system.

Also, globs aren't regexes. The syntax "sourceGroup1/*.cpp" interpreted as a regex matches the string "sourceGroup1" followed by 0 or more "/"s followed by any character followed by the string "cpp".

Subjunctive
Sep 12, 2006

✨sparkle and shine✨

rjmccall posted:

everything I’ve heard is that the 3-to-4 transition is painless, and that’s likely to be the rule going forward.

I’ve also heard that, but I’m talking about co-existence tooling, not upgrade help. If I have 10 modules in my program, I can write them in ObjC, C++, and Swift, and convert modules between those on their own schedules. Xcode can mix those different languages painlessly. I can’t AFAICT upgrade any module from Swift 3 to Swift 4 unless I do all of them at the same time that I flag-day my CI machines and all developers. If 10 modules becomes 75 it’s even worse. Developers with 10KLOC and a dozen team members can handle it, but Swift seems so much nicer than ObjC for large scale development that it’s a shame the version interactions make it so painful.

I have been assuming that Apple has some special system for this so that All The Builds don’t come screeching to a halt on Swift version days, but I unsurprisingly haven’t heard tell of it.

Plorkyeran
Mar 22, 2007

To Escape The Shackles Of The Old Forums, We Must Reject The Tribal Negativity He Endorsed
You can't mix Xcode versions, but you can mix swift 3.2 and swift 4 modules.

Azuth0667
Sep 20, 2011

By the word of Zoroaster, no business decision is poor when it involves Ahura Mazda.
What should I look into to figure out how to transform two 1D arrays into a 2D array in C?

Jeffrey of YOSPOS
Dec 22, 2005

GET LOSE, YOU CAN'T COMPARE WITH MY POWERS
Definitely clarify more than that - do you want to end up with an n by 2 array? Maybe say what domain this is for? How is the 2d array going to be used? I kinda feel like that's the sort of thing that you ought to figure out how to piece together on your own, it's trivial if you know how things work and dangerous if you don't. Any reason not to loop through and copying wouldn't work.

Azuth0667
Sep 20, 2011

By the word of Zoroaster, no business decision is poor when it involves Ahura Mazda.

Jeffrey of YOSPOS posted:

Definitely clarify more than that - do you want to end up with an n by 2 array? Maybe say what domain this is for? How is the 2d array going to be used? I kinda feel like that's the sort of thing that you ought to figure out how to piece together on your own, it's trivial if you know how things work and dangerous if you don't. Any reason not to loop through and copying wouldn't work.

Sorry, I'm still learning/self teaching C. Your questions helped me find a mistake.

I was using
code:
int locationXY[userinput][userinput]
both elements(?) of which could go up to whatever the use input. I think that's a mistake because the first index only needs to be 1 because I only have two dimensions to store values for, x and y. The second index should be 9 because the grid is only a 10 by 10 grid.
code:
int locationXY[1][9]
should cover both dimensions, x and y, and values up to 10. I think this is the right way to go about it?

This is probably a dumb question but, I've never read anything going into detail about it in the online tutorials I've read/watched, what is dangerous about any of this?

Jose Valasquez
Apr 8, 2005

Azuth0667 posted:

Sorry, I'm still learning/self teaching C. Your questions helped me find a mistake.

I was using
code:
int locationXY[userinput][userinput]
both elements(?) of which could go up to whatever the use input. I think that's a mistake because the first index only needs to be 1 because I only have two dimensions to store values for, x and y. The second index should be 9 because the grid is only a 10 by 10 grid.
code:
int locationXY[1][9]
should cover both dimensions, x and y, and values up to 10. I think this is the right way to go about it?

This is probably a dumb question but, I've never read anything going into detail about it in the online tutorials I've read/watched, what is dangerous about any of this?
When you are declaring an array the numbers are not 0 based, so you would want [2][10] in your example.

But if you have a 10x10 grid why wouldn't you have int locationXY[10][10]?

Jeffrey of YOSPOS
Dec 22, 2005

GET LOSE, YOU CAN'T COMPARE WITH MY POWERS
Arrays are prove to out of bounds errors, my concern would be that you'd be given a firm rigid way of doing something, and only learn to manipulate that without understanding it. I see C as somewhat portable assembly language and is hard for me to think of it as a language whose abstractions I can trust without knowing how they work all the way.

So like, I suspect some XY problem here - what are you trying to store in a 2d array? How many values are you storing? 20 or 100 are both reasonable answers but you should be able to answer before you write any code.

If you want points on a n by n coordinate grid you want array[n][n]. If you want two arrays of size n, you could use an array[10][2], but I'd probably just use two arrays instead. It might be easier to post a (small) snippet of code and how it's defying expectations if you've already written something.

whose tuggin
Nov 6, 2009

by Hand Knit
Are there any C/C++ or related programming Certifications that are worth a suck/gently caress?

I found this https://cppinstitute.org/cla-exam-syllabus?PHPSESSID=e64oql2uqpp5ijur8kuo7i2uq4 , and was checking out some of the sample questions. But I'm aware that any certification could easily be a worthless scam.

I'm a junior in Computer Engineering, and I want to be able to put some kind of certification like this (that actually means something to employers) on my resumé. In school, we use (almost exclusively) C, but I am thinking about minoring in C.S. which wlll add Java into the mix.

qsvui
Aug 23, 2003
some crazy thing
I was at CppCon last year and some of the big names there didn't seem to know anything about a C++ certification and actually kinda laughed it off.

Jeffrey of YOSPOS
Dec 22, 2005

GET LOSE, YOU CAN'T COMPARE WITH MY POWERS
*lifts up shirt to show battle scars, man boobs* this is my certification

Adbot
ADBOT LOVES YOU

Ralith
Jan 12, 2011

I see a ship in the harbor
I can and shall obey
But if it wasn't for your misfortune
I'd be a heavenly person today
Certifications are mostly seen as a thing for IT staff. If you want to prove you can write software, do so, then publish it on github.

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply