7

For the past several years I have been feeling quite embarrassed about my coding abilities. I've been self studying most nights trying to catch up to my peers but I feel like I have a moving target. I feel like my years of work experience does not reflect my coding ability at all.

This post will go over my programming history, then how I am currently studying to improve my technical skills, then finally what I think my weaknesses are as a developer. What I am trying to get out of this post is how I can improve as a developer in my current embarrassing situation.

A bit about my past:

I graduated from a UX design program 6 years ago. I did several internships during my time in college. My first boss told me that my UX skills were lacking but he saw that I had potential in web development (I put together a basic static website for his company). Since then I decided to slowly teach myself web development.

I did my second and final internship at a well known IT companies (Amazon, Apple...) as a junior developer. Unfortunately I did not get a chance to do much programming due to over staffing of interns.

After graduation I got hired as a junior software engineer at another large well known IT company where I worked for 6 years. My manager knew that I didn't have a very strong programming background so I was only assigned very simple programming tasks to do. I thought I was a good developer for most of these years as everyone praised me for how fast I was able to complete my work.

Last year before I got let go (due to company restructuring) I was speaking to a senior developer and he quickly noticed that I was lacking a lot of basic front end programming skills. He felt like my programming skills were equivalent of a 2nd or 3rd year computer science student instead of an intermediate software engineer. After hearing this I started spending my free time self studying.

After I got let go at my previous job I got a software development position at a smaller IT company. I work with several other developers, all of which have about one year of working experience. My team lead has about 4 years of software development experience. Needless to say, I have by far the most software development experience on my team yet I have the worst coding ability.

I guess my problem is that I feel very incompetent and embarrassed as a programmer. I have all this years of experience working and a beautiful resume, but my programming abilities do not match my experience/resume. I feel embarrassed having to bother my peers about programming issues that they don't seem to face. I feel lost when they talk about how to better architect the code. I feel exhausted that I spend every day at work coding, and then spend my evenings studying more code.

I have a subscription to PluralSight and do follow a few front end email feeds. Over the past year I feel like I have increased my CSS/JavaScript from a basic level to an intermediate level. My new company is using Angular and I feel like I have an intermediate-ish understanding of the framework. I am currently finishing up an Angular app. I plan on learning Java next (via PluralSight) as my manager wants to transform me from a front end dev to a full stack dev.

I guess my question is what can I do to rapidly become a stronger developer? I feel like no matter how hard I study I have trouble thinking like a developer. I feel like I don't know how to properly debug (my general strategy is to comment out several lines at a time to isolate the problem). I have trouble reading documentation hence why I subscribe to PluralSight for instructional videos. I don't have any developer friends I can talk to about this.

Votes + Comments
Late +1. Good attitude really pays off over time.
Understandable. Best developer qualities are: Honesty + Humility (Humble, not self deprecating). Would be glad to help :)
Yep
Thumbs up for your honesty, which already makes you a better developer than many!
Brave and honest. Deserves our full support.
5
Contributors
8
Replies
77
Views
4 Months
Discussion Span
Last Post by nigelwright7557
3

First: I congratulate you on your honesty and bravery in making that post.

Second: You have already taken at least three giant steps where most others will have already failed:
You recognise that you need to improve
You believe that you are capable of improving
You are willing and able to invest time and effort into improving

I'm out of time right now, but I'll get back to you later today with some thoughts on asking for help, doc vs video, and debugging.

Finally:

I don't have any developer friends I can talk to about this.

Yes you do now, you just joined DaniWeb.

Edited by JamesCherrill

Votes + Comments
All but true
100% agreement
0

I have trouble reading documentation hence -> instructional videos

Reading doc is a fundamental skill for a developer. Nobody knows all the parameters of all the APIs in a full stack. They rely on being able to quickly find and understand the info they need as and when they need it. Videos are easy, but a very slow and inefficient way to get info.
Videos are most useful for getting concepts and overviews, but as soon as they get into details you are spending a lot of time.
I strongly suggest that you spend time getting to know the key documentation for the technologies you are using. Skim through them to see what info is there, and how it is organised. Don't try to remember the info, just remember how to find it.
I also worry that you may be spending hours watching videos when that time could be better spent writing a simple app that uses whatever you are trying to learn. Most people learn best by doing.

To be continued...

Edited by JamesCherrill

1

A huge problem I had to deal with several times over the years is the programmer who overestimates their abilities. I would much rather work with a programmer like you than one of those yobs.

Votes + Comments
Ditto. Honesty upfront saves the fresh dev a lot of stress, saves the senior dev lots of time, and helps them both because the Senior knows to mentor.
0

I feel like I don't know how to properly debug (my general strategy is to comment out several lines at a time to isolate the problem)

I don't think I've ever heard of commenting out code as a debugging technique!

Maybe you are writing too many lines of code before running a test. Real coders test early and test often. This means a bit of throw-away code eg to call the method you are working on and print the results without having to start up the whole application. If you are unfamiliar with the APIs you are using then testing after 6 lines of new code wouldn't be silly. Anf if the test failed you would know that the problem was in those 6 lines. If you are completely new to the APIs then try a a complete throw-away mini-app to see how it works and get the exact parameters befroe trying to fit it in the real environment.

You didn't say what tools/IDE you are using, but you should have some kind of break/step/display variables debugger at your fingertips. Maybe you have been put off by its learning curve (most people are at first), but it's a great investment. If not you can use lots of print statements to show what's being evaluated a each line. That will immediatley tell you where its going wrong. (If you don't know what the intermediate results should be then you were coding blind and are doomed to failure. You should never write a line of code if you don't have a clear idea of what result it should return.)

T.B.C...

1

I feel embarrassed having to bother my peers about programming issues that they don't seem to face

Why? Asking someone for their advice is the sincerest form of flattery.

The trick is to keep the questions short and specific, because most people don't have time for a long discussion. Try questions like
I used this <code construct> but it seems tacky. Is there a better way?
Where can I find info on <API>?
Is it better to do <concrete example 1> or <concrete example 2>

Sure, some people are jerks and won't help you, but most people are pretty decent, just give them the chance.

Finally, when people spend time helping you don't forget to say "thanks"

Edited by JamesCherrill

0

Let me start with a congratulations. You have just stepped outside of the Ego-ring that so many developers live. You are the kind of developer I would rather have on my team over one that might have the skills necessary to get the job done on time but leaves lots of bad mistakes in their code because they didn't feel they needed to ask for help or peer review.

There's lots of things you can do to help you get to where you feel more confident in what you do for a living. I think one of the biggest caveats is that you can learn and memorize until you dream in code, but it will not help you in application if you don't have the following ingredients:

  1. The desire to continue to learn more
  2. The muscle memory used to write pseudocode and then actual code
  3. How to think in terms of a program or a computer

You have #1 or you wouldn't be here and you would have given up well before now. Another great site to check out is Udemy.com . I'm actually in the works on a course there for helping people learn new programming languages the way I do. It employs all 3 of the above and I will be going into detail on the basics/foundations that are oh so important in order for you to become not just comfortable in a language/framework, but also fluent. It'll be a while before my specific course series is up there, but I plan to have a free one that would be your "foundations" course: as in this course will teach you the jargon you need to know and the way to think of solving a problem like a computer; you'll learn pseudo code which is a great tool.

But, I wanted to point out the site, Udemy.com because it has a plethora of knowledge; there's almost always a deal going on for $9.99, $10.99, $11.99, etc on their courses and even quite a few free ones; the courses cover everything you could hope to learn as a software developer once you have the basics and even some will teach you the basics just enough to pick up a new language and sometimes a new framework or even the full stack if you go web developer.

For the next one, #2, it is more about how you apply your theory and knowledge to solve a problem. It relies a lot on #3 and will get beefed up the more and more you continue with #1. The more you research, learn, and practice, the more fluently you'll be able to solve problems in psuedocode. That means that you'll be able to solve a problem in a language-agnostic way so that you can use any language or stack to solve your problems. Starting out, this skill will be heavily dependant on your knowledge of 1 or 2 languages, and moreso on the stack that you are used to. Eventually, however, you will learn enough foundation that you will approach problems more generically. The more you use this skill in your own code/comments (I'll detail below), the better you will get and the sooner you will be able to see problems in blocks of psuedocode or in paradigms/patterns.

For instance, if you need to create a simple forum, you would want to have forum boards, subforums, categories, tags, etc. What is a search and what do you need to search over? To allow someone to search for a topic, you would want to allow searching across titles, subtitles, notes, tags, headers, forum/category/subforum titles, and content. So, you might want to first focus on making search work on titles of posts, then forums/subforums/etc. In this way, you can see your solution step by step. Once you are finished with your search, you'll notice that likely, your search will take longer and longer with more forums/subforums/posts/tags. So, you'll want to find a way to first search the places you expect to find something. You might even limit the search to specific places and force the client to expand his/her search.

Breaking down your problem simplifies your approach, enables you to see your solution in your mind, gives you something small to make work first, then you add upon that until you have a final solution. This also makes debugging simpler and improving your expediency at the end means you don't wind up with things you cannot test or objectively analyse. That paragraph about search is one way to think about a problem in non-technical speak, more a bridge between application jargon and business problems. Lastly, because I focused on separating the problem into pieces, tackling them one by one, and finally worried about efficiency, I didn't over-complicate the problem. It can be broken down into small tasks that each can be either sized empirically or guestimated.

Learning to program is very much like this as well. If our exercise above is how to break the problem down into solvable pieces, we then need to think how a computer would solve each problem. For this post, I'll finish with a work example to get your brain thinking about problems in a way that you could actually write code to solve each problem - once you have broken it down into steps that you would do if this were physical objects. Most of the time in code, we tend to treat pieces of data either as objects in computer speak or objects in user/app speak. The more we can lean towards user/app speak, the more often our problems will maintain an element of self-documentation.

If you have 6 buckets full of pieces of paper, those pieces will have unlimited amount of space for information and will have the following information. Also, the naming scheme I have used may or may not match typical forum jargon. It's merely a starting point for sake of setting up an example.

  1. Bucket 1 labeled "Major Forum Categories" or "MajorCategories". Each piece has the name:CatName and an identifier: CatID. There is only one of each category name (no repeats or duplicates).
  2. Bucket 2 is your "ForumBoards". There's a name: ForumName, identifier: ForumID, and the identifier for it's parent MajorCategory: CatID. Follows bucket 1 duplicates rule.
  3. Bucket 3 is your "SubForums". There's a name: "SubForumName", identifier: "SubForumID", and identifier for it's parent Forum: "ForumID". Follows same rule of duplicates as buckets 1 and 2.
  4. Bucket 4 is your "Topics". There's name: "TopicName", identifier: "TopicID", and a subforum: "SubForumID".
  5. Bucket 5 is users "Users". We'll keep it simple for now with name: "UserName", first name: "FirstName", last name: "LastName", date of birth: "DOB", and identifier: "UserID".
  6. Bucket 6 is your actual Posts. There's name: PostName, header: PostHeader, content: PostContent, tags (multiple tags allowed): PostTags, created date: "PostDate", owner: "OwnerUserID", identifier: "PostID", and topic: "TopicID".

Assuming there's room for more buckets and each bucket is supposed to hold only 1 real piece of info or 1 subject of data if you will (a profile could be it's own bucket, etc)

What would you do to add the following information?
A. Allow unlimited replies to each post that also includes a reply date, who posted the reply?
A.1. What about updates to a reply with date of update?
A.2. What about being able to see the history of updates to a reply?
A.3. Support for comments on a reply? Include links and info you think necessary as the minimum. No need for edits/comments on comments.
B. Allow the same update history and date info mechanic for posts?
B.1. Support for comments on the post?
C. Alow support for upvotes/downvotes on posts, replies, and comments.
D. Give points to users based on number of comments, posts, replies. Keep the polls separate (don't combine comment, post, upvote/downvote, and reply counts).
E. Allow replies to be marked as answers by the original poster (OP). Only 1 reply can be an answer. Give additional point(s) to reply owner based on replies marked as answers (another category for points)
F. Provide a ranking system for each user based on their points. Replies with answers are worth the most, replies with positive vote counts, then posts, then negative replies, followed by comments.
G. Provide a profile for each user. This will have a field for Name, address, country, cell?, email, popular messenger sn's, hobbies, job title/field, a "who am I" section, and all the other data points from your User paper slip. Move off all the user info except for it's username, identifier, and add a password field. (we won't deal with password hashing/recovery here because this is an exercise, not a live product).

Now, with all that info, we have the very basics of a forum. That data all represents your database, where each bucket is it's own database table. Now, for the fun part, create your matching database. MySQL, PostGreSQL, SQLite, MicrosoftSQLServerExpress MSSQL Express), and many others provide free database engines. Some even come with your typical website host. Setup your machine to run a website locally (if it's not already doing so), and install your database of choice. MySQL is typically accessible by either built-in APIs or easy to find/install MySQL specific APIs. For example, PHP has 2 built-ins depending on language version, 1 might be deprecated. ASP.NET can access MSSQL, access, and MSSQL Express out of the box with super basic support for other DB's as well. If you want to hit up MySQL, you'll need to go to their website and download. Ruby I believe also can hit up MySQL for free. I've used all of the above and a few others. MySQL, MSSQL/MSSQL-Express, and SQLite are my favorites/preferred for most starter projects. SQLite doesn't require a huge download/install process nor does it require intensive CPU/RAM requirements when running (also great for laptops). Perfect for this exercise.

Now, try to implement your forum boards website in your preferred language. Your preferred search engine(s) will be your best friend unless you are proficient enough to set this up yourself. If you are doing Java, there's 2 basic java web back/front-ends I believe (Java Servlets and JSP: Java-Server-Pages). There's likely more, but I've not used Java as my backing website language in a very, very long time. I don't know your OS, but in windows, you'll want IISExpress or IIS which can be installed via your windows install dvd/bd if its not already.

On linux, there's many options for either a basic webhost or a full-stack install: Apache HTTP, Apache Tomcat, Lamp, and much more. PHP will come with your LAMP install, java requires Tomcat I believe but might be able to run via your LAMP install due to Apache being installed under the hood. I won't go into all the details here because I only host on linux when dealing with a client that is already there, otherwise I use windows and IIS/IISExpress/Apache. The point here is that you find what you like and run with it.

You google/yahoo/bing/etc all the details that are not important enough to memorize and recall all the time. If a programmer/developer/coder tells you they remember everything or most things, then they are either an habitual lier, egotistical, or actually have some form of insane memory (such as phonetic memory, color memory, photagraphical memory, etc). If you are using Java/PHP/ASP.NET/etc, then their main homepage will have all the info you need to get a basic site up and running locally. In windows, permissions can be a pain if you don't install things in the proper order (IIS/IISExpress, THEN ASP.NET, etc). For linux/mac/unix, idr. On mac, homebrew and node.js will essentially spell out how to setup your station to host node websites if that is your thing.

0

Software is like most things, practice, practice and more practice.
I have been programming for 40 years in assembler, c, c++, c#, asp, sql server, .net and wpf.
Its impossible to stay an expert at all of them all the time as its just too much to remember. I wish I had a photographics memory but I dont.
So I just do the best I can.
The trouble is I might spend 3 months on a C++ project then have to go to a C# project by which time i have forgotten the differences between them and have to keep looking up commands.
Software is very specialist and so not everyone can do it. It needs a very special person to be good at all of it.

Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.