Advice for an average developer

Advice for an average developer
0

Hi, I’m an average developer who can create regular websites and apps. I am able to grasp most languages, libraries and frameworks but don’t know how to create them. I want to be able to do a lot more than that. I also lack good knowledge of Data Structures, Algorithms, Design Patterns, Software Architecture and Math. I want to become a really good Software Engineer.

I have a degree in Software Engineering but I didn’t study properly during college so here I am struggling to build anything great. I want to learn a lot of things but don’t know where to begin. I usually start learning something and soon end up changing the technology without actually understanding it properly. I also have one year experience as a Web Developer.

To get a better understanding of my skills you can check out the following links:

  1. Github Profile
  2. Latest Project
  3. HackerRank Profile
  4. HackerEarth Profile

Here are the things that I know:

  1. HTML, CSS, JavaScript & jQuery (Intermediate).
  2. C++ & Java (Basic).
  3. PHP, CodeIgniter & MVC (Basic).
  4. NodeJS, VueJS, REST API & AWS (Basic).
  5. Array, Linked List, Set & Map (Basic).
  6. Web & App Development (Intermediate).
  7. SQL & NoSQL (Basic).

So what I’m asking you is to give me a rough idea of the things I should learn in order and how to learn them. I wish to acquire solid foundation in all the skills I mentioned. I don’t want to be an average developer the rest of my life!

Please give me your advice, Thanks!

You should have studied harder in college.

OK, I made a joke. But seriously, you have a degree in Software Engineering. You’ve been through the educational process. You know what it takes to learn these things (although it sounds like maybe you didn’t give it your full effort the first time). I doubt you need anyone here telling you what you need to do to become more proficient in any of these areas.

1 Like

:laughing: Thanks for your response @bbsmooth . I agree I should have studied harder but I am really lost now, I don’t know where to begin and how to stay consistent.

That’s how I started, graduated with a cs degree,
Learnt so many languages,
But at the end I made a decision about studying web development.
Its good how you are getting knowing some languages
Just code day by day
Never give up
We are all struggling on what great thing to build!!!

1 Like

You have a solid foundation already, looks like. You have the freedom to go whatever direction you like, there’s no one-size-fits-all path. Pick a category that interests you and go wild.

2 Likes

Thank you very much @morgangithub12 and @chuckadams. I really appreciate your advice and I figured that in order for me to become a great Software Engineer, I have to build a solid foundation. Hence, I’ve decided to study from the beginning using this Open Source Computer Science Degree called OSSU. It could take more than a year but I believe I have to relearn everything I should have in the first place. Thanks again for your help everyone.

Create a component (class, function, service, whatever) that does one thing only one thing, and does it well. Then another one. And then another one. Usually the next big thing is that, a framework/library combining a lot of those components.

Examples:

  • Validate a json/xml/csv input against a schema.
  • Construct a schema based on a json/xml/csv input.
  • Take a string that looks like a number and try to get an integer or float out of it.
  • Take a string that looks like a date and same thing.
  • Take html/css (or some other structure/style taxonomy) and convert it to pdf with page size constraints (US letter, legal, A4, etc.).
  • Create a process able to register itself as a valid service on the host OS.
  • List running services, identify which ones are (say) database or web servers.

In all cases, identify the constraints your input should adhere too, enforce them, add workarounds, etc.

The benefit of this is that after some time (generally less than you’d know) you’ll have the building blocks to create anything you can think of. It also keeps the mind sharp, and solving problems provides small doses of gratification.

A simple example below (it’s in Python, which is not amongst the languages you’ve listed, but I think it’ll be clear enough with the comments).

One day I found out that I was often dealing with several files at once and to tell apart their path, base name and extensions, which is simple enough but also annoying enough to have to do over and over, so I’ve created this function:

import os

# 'root' is (hopefully) a string with the starting folder. If omitted,
# it will default to the current directory ('os.curdir').
#
# 'exts' is (hopefully) a string or a list/tuple of strings. If
# omitted, it will default to 'None' (Python's null). Otherswise,
# we'll use it as a list of file extensions we want to include.
def get_files_info(root, exts=None): 

    # 'keys' is a tuple of values we'll use to tag a Python dict.
    # 'files' is an empty list where we'll store those dicts.
    keys = ('filename', 'basename', 'extension', 'path', 'fullname')
    files = []
    
    # Long story short: 'os.walk' recursively lists all files in all 
    # subdirectories from the starting point (in this case 'root').
    #
    # What matters in this case: by nesting this two iterations, on
    # each round we'll get the name of a file in 'filename' and its
    # full folder hierarchy in 'path'.
    for path, folders, filenames in os.walk(root):
        for filename in filenames:

            # Concatenate 'path', '/' and 'filename' into 'fullname'.
            fullname = f'{path}/{filename}'

            # If 'filename' contains at least one dot, split over the
            # last of those and assign the resulting substrings to
            # 'basename' and 'extension'.
            if '.' in filename:
                basename, extension = filename.rsplit('.', 1)
            else:
            # Otherwise, all of 'filename' is assigned to 'basename'
            # and 'extension' is left blank.
                basename = filename
                extension = ''
                
            # 'any' is a function that takes a collection of booleans and
            # returns True if at least one of them is true.
            # In this case:
            # - 'not exts' means that 'exts' is null or empty.
            # - 'extension in exts' means that the extension matches
            #   the value or values on exts.
            if any((not exts, extension in exts)):
                # We group the variables on a tuple called 'values'.
                values = (filename, basename, extension, path, fullname)
                # We zip 'keys' (defined earlies) and 'values' in a dict.
                file = dict(zip(keys, values))
                # We append the dict to the 'files' list.
                files.append(file)
    
    # If the 'files' list is not empty, return it. Otherwise return None.
    if files:
        return files
    else:
        return None

So, for example, if you were to call it like this:

svgfiles = get_files_info('/Users/frank/code/app', 'svg')

You’d get something like this:

[{'filename': 'search.svg',
  'basename': 'search',
  'extension': 'svg',
  'path': '/Users/frank/code/app/webclient/res/icons',
  'fullname': '/Users/frank/code/app/webclient/res/icons/search.svg'},
 {'filename': 'burger_menu.svg',
  'basename': 'burger_menu',
  'extension': 'svg',
  'path': '/Users/frank/code/app/webclient/res/icons',
  'fullname': '/Users/frank/code/app/webclient/res/icons/burger_menu.svg'},
 {'filename': 'settings.svg',
  'basename': 'settings',
  'extension': 'svg',
  'path': '/Users/frank/code/app/webclient/res/icons',
  'fullname': '/Users/frank/code/app/webclient/res/icons/settings.svg'}]

And if you were to call it like this:

files = get_files_info('/Users/frank/code/app', ['html', 'png'])

You’d get something like this:

[{'filename': 'index.html',
  'basename': 'index',
  'extension': 'html',
  'path': '/Users/frank/code/app/webclient/',
  'fullname': '/Users/frank/code/app/webclient/index.html'},
 {'filename': 'logo.png',
  'basename': 'logo',
  'extension': 'png',
  'path': '/Users/frank/code/app/webclient/res',
  'fullname': '/Users/frank/code/app/webclient/res/icons/logo.png'}]

Silly enough, and there’s probably other ways of doing it, but it was faster to write it myself than to look for something, it felt good to do it and for all I know this may have been the foundation stone of my own ext big thing.

1 Like

Thank you so much for your wonderful answer @fjmac. I agree with your approach and I’ve tried it before but I always end up solving these problems in a naive way and not the best way. For example I tried to make a Search Engine like Google once and I had no idea what indexing was and how Google did it first (Reverse Index + PageRank). I ended up creating a very silly and highly inefficient version of it. When I realized that it was too slow for any practical purposes, I deleted the project, lookup up how it’s done and then implemented it properly using Reverse Index and PageRank.

What I’m saying is I’ve tried this approach and ended up with a lot of naive code. It’s like I couldn’t find the best way to do things myself. Maybe I missed something or maybe I should’ve given more efforts.

I would recommend you to just build stuff. Software development is a craft and you can’t learn it passively, you have to actively try to build better software and build a lot of software. Ideally, you should also work in an environment where your peers are better than you, but that’s not always possible (although i do recommend open source software, regardless of your day to day job).

One thing to note is that you don’t necessarily need to know how to do something before you start a project. Just think of something you’d like to build, do the bare minimum research to get it done and afterwards do a more thorough research so you can improve it. Think of software development like learning how to draw or make music; you study the bare minimum to do something practical, then you practice a lot, then you study more advanced concepts so you can practice on more complex exercises. You’d never spend 6 months studying music theory before playing an instrument, it’s unimaginable. You should approach software development the same way.
Think of a project you’re not yet capable of doing -> Study the bare minimum to get it out of the door as soon as possible -> Practice, practice, practice -> research how to improve your practical solution.

Good luck!

3 Likes

Thank you so much @Selhar1. I didn’t think it this way. You are absolutely right. I have to fix my approach first. After building projects, I usually gets frustrated due to the lack of an optimal solution rather than improving it. Instead of learning continuously, I have to build projects and practice what I learned before learning more. I have to become very good at what I already know before picking up new things. Thank you so much for this eye opening response. I will follow your advice :smile:

1 Like

Seems like you are in the same predicament as me many years back.
What you are experiencing isn’t a technical issue. It is personal.

You already pin point the stuff that you need to learn. The struggle here is not the subject, is YOU!

The patience, the will power, the delay gratification, concrete goals, and massive result.
The restraint to side track, procrastination, self doubt, naysayers, greed.
The decision, the commitment, the pains and struggles.

Why do I say that?
14 years ago when I graduated from college in video game development. I was below average in everything art, programming, story telling, music, marketing, with the exception of decomposing and reconstructing video game worlds, which is the only thing I was good at that I wasn’t aware of until much later in life.

For a few years, I thought the problem was the subject being too hard and I wasn’t the person for it. So I settle for being “alright” or"good enough", making an alright living (from my perspective), have a few nice things here and there, but you’re never really in a place that satisfy you.

Our of curiosity, I tried again and I started reading a lot of books about how to be more successful. A whole new world exploded in my face with subjects you never even considered is a factor. Finance, Belief System, Psychology, Communication, Perspective, Body Language, Public Speaking, Motivation, Leadership, Relationship, Culture, Market Trends, etc.

By the time I am done with all that to the degree that I am started to “get it”. I understood the problem was ME. The old me is simply wasn’t built for extraordinary achievements, there is too much that I haven’t explored and wanted too much out of life too early.

Then I started re-calibrate myself by unlearning bad behaviors and relearning good ones that supports my ultimate end goal.

Back to You
So, you’re gonna have to sit back and think about yourself on a different level and concentrate on improve your overall quality of character and how you see this subject as a whole.

This is not meant to be some personal development cliche, but it is.

When you’re talking about going from being average to extraordinary, it takes a different perspective and lens to change that. I don’t just mean read more books, listen to more podcast. You literally have to shift how you operate as a person.

For example: You say you want to learn Math, but you have this bad habit of procrastinating and focus on another subject when things get tough. Then it’ll be very difficult for you be good at anything.

Where as someone who wants to learn Math, but don’t have that sense of procrastination with moderately decent focus on Math and are willing to think about the problems at hand and learn to incorporate that into your current skill set. This person will be very scary.

My Suggestion:
Write down everything about yourself and how you view this subject.
Write down the expectation you have for your future self.

Then think real hard what you need to change to get there.

3 Likes

Your answer hit me like a train @Cowwy! I guess I know what I have to do but I avoid it for some reason. Maybe it’s my lack of confidence, fear of failure or the result of my bad habits. I don’t know what to say. I feel responsible for where I’m today. I don’t know what to say. Thanks for your response @Cowwy. I really appreciate your suggestions.

1 Like

Well, naive code is inevitable. I’ve written more embarrassing code than I’d care to count (and still do, probably). Just shrug it off. The importan skill is to identify the smaller problems that present themselves often (handling lots of files, parsing data that’s not normalized, timeouts, bottlenecks, etc.) and have a solution on hand, or know how to implement it.

Code quality comes with time. First solve the problem. The code will be naive, confusing, or both. Then at some point you’ll want to integrate that component into a larger solution. You’ll need to refactor so it can interface better. Now your code will be much better. Then at some point you’ll see that under certain stress conditions your component gets terribly slow. You’ll improve it some more. And the next time you need to write a component you’ll know better and will be able to identify most of the possible problems before hand.

TLDR: write lots of naive code, you’ll still be learning the important skill: identify requirements and problems, and address/solve them.

1 Like

If you’re looking back at your code from 5 years ago and not cringing a little, then you’re probably not growing as a developer.

1 Like

I definitely agree with you both @fjmac and @chuckadams. I guess procrastinating and waiting for the perfect time to build things is not gonna help me anymore. I have to tackle the things that I can’t do yet and learn stuff based on real problems that I face instead of learning everything all at once and hoping I’ll be a great developer automatically just by knowing the theory. Thanks you guys for showing me the right way!

Is really the best approach just build more things?

When I tried to build more things I only find my self going deeper and deeper in the problem domain and edge cases. But that is not that difficult, at least for me the difficult part is how to organize, divide and how to express the relations between each part of the code.

If I just build more things from scratch I end up in a chicken and egg situation: I will need to code in order to explore the problem domain but at the same time I will need to take decisions about how to organize, divide etc. without that knowledge (problem domain knowledge that I need to take that decisions).

Probably a slighter better approach is study some open source program that already solved the problem you want to try. Read documentations, comments, git logs, pull requests everything about the program etc[0]. or talk with the developer of the project[1].

In that sense, I think that learn algorithms, data structures etc. , is really an advantage: is a common language ( there is no need to explains ideas, concepts etc.) and make communication easier.

About the naive code, I think that has something to do with the idea of “The Right Thing”[2], and I think that is part of being a programmer.

Also about naive code, yesterday reading Hacker News I found this post[3]:

The Hardest Program I’ve Ever Written – How a code formatter works

And the first comment is:

Philip Wadler has a seminal paper [0] on implementing pretty printers by modeling them using an algebra. There’s implementations of the algorithm in most programming languages nowadays, and some state of the art advances that help with performance [1]

Cheers and happy coding :slight_smile:


Notes:

[0] Hackers: Heroes of the Computer Revolution

“The important thing about a program is that it’s something you can show to people, and they can read it and they can learn something from it. It carries information. It’s a piece of your mind that you can write down and give to someone else just like a book.”

[1] Hackers: Heroes of the Computer Revolution

He stuck at it, hung around Gosper a lot, toned down his know-it-all attitude, and, above all, became an impressive programmer.

[2] Hackers: Heroes of the Computer Revolution

The Right Thing:
implied that to any problem, whether a programming dilemma, a hardware interface mismatch, or a question of soft- ware architecture, a solution existed that was just . . . it. The per- fect algorithm. You’d have hacked right into the sweet spot, and anyone with half a brain would see that the straight line between two points had been drawn, and there was no sense trying to top it. “The Right Thing,” Gosper would later explain, “very specifi- cally meant the unique, correct, elegant solution . . . the thing that satisfied all the constraints at the same time, which everyone seemed to believe existed for most problems.”

[3] https://news.ycombinator.com/item?id=22706242