I am a mediocre developer
dev.to
dev.to
Re: "I google simplest things all the time", I once wrote my own regular expression parser, context free grammar parser, etc. in Lisp, Python, Perl, and JavaScript.
But to this day I still have to google javascript syntax to work with regular expression for certain things.
Memory is no longer a competitive advantage, the real competitive advantage is the ability and discipline to do everything OP talks about in the post
Second honest question, did you have to do that, or did you do that because it was Not Invented Here?
Virtually no-one in our industry needs to write algos regularly. If you are, that probably means you're a bad programmer suffering from NIH syndrome. Or you're one of a tiny group who actually need to because you're doing something cutting edge.
Most of the time is db stuff, sure. But it is always useful someone who can think and solve problems.
Do you actually believe that's true? I can understand if this is just a knee-jerk comment that you haven't put thought into, but if it isn't that, I truly hate your kind of thinking.
While I'm not a fan of modern front-end programming, I do appreciate the sheer amount of knowledge and tedium involved in making that 'read/write DB operation' actually work in the context of the demands of modern front-end development, and I despise those who pretend it's trivial.
Is it different from the kind of knowledge necessary for picking the right algorithm? sure! Is it inferior (by whatever definition that self-servingly serves), and does it involve 'knowing nothing'? Far from it. Knowing what's necessary for a lot of front-end work is far from trivial, and while I dislike it, pretending it involves no knowledge or expertise is 100% pure bullshit.
Let's imagine all you know is handling a full-featured framework like Rails or Django - while relatively mundane and boring I'd argue that alone turns you into a very capable developer who's able to make things happen without diving into rocket science.
I find many discussions about these issues tiresome because they feel like someone arguing that 'writing', in general, is about grammar, or vocabulary, or style, or whatnot. It's about all these things, and none of these things, depending on the context.
I think about 5% of all developers out there nowadays are actually good developers. IME, most would have no idea what to do if you took away stackoverflow or their abstractions that make their day manageable.
A part of the problem might be that a lot I've met aren't at all interested in development, it's a job and they like the pay. They also just see it as a stepping stone to management.
When I do ask people at work how something actually works they rarely know. I get told just use 'x' it hides all that stuff away for you!
When I bring up basic concepts around coding, and therefore issues in their code, I get blank stares.
I mean, i've seen me having to explain to a C# dev with a few years experience why something like the following didn't work:
string s = "foobar";
s.Substring(1, 2);
Console.WriteLine(s);
He didn't know strings were immutable, didn't know how to understand the documentation for Substring and had never heard of immutability.Similarly, I've had to explain why something like the following prints 5 and not 6:
void Main()
{
int x = 5;
Foo(x);
Console.WriteLine(x);
}
void Foo(int x) => x++;
A developer this time who had no idea about reference types & value types.I don't know how we fix this though. As the people hiring and doing the interviews often don't know what they are doing either. So the blind hires the blind.
Before people get upset, yes, there are devs without a degree that know what they are doing.
About the immutablity of strings : Is it absolutely necessary for a string to be immutable? What harm could it do otherwise? I learnt immutablity on my own and apprently there's no such constraint in languages like C/C++, although the same behaviour can be replicated using `const`.
I don't know C# but shouldn't `Console.WriteLine(s.Substring(1, 2));` have worked. No need to worry about immutability, at least in this case.
You also get linq style benefits, e.g.
string s = "this is a string";
if(s.Substring(5).ToUpperInvariant().StartsWith("I"))
Console.WriteLine("true");
Console.WriteLine(s);
If strings weren't immutable, you'd have to copy s to avoid changing / breaking it.These are things that I would expect a .NET developer to know. They are basic fundamentals.
Really? Forcing you to copy whenever you want to modify gives you worse performance.
> If strings weren't immutable, you'd have to copy s to avoid changing / breaking it.
That seems like a disadvantage to me. With mutable strings, you have the option to modify it in place instead of being forced to copy.
C and C++ actually do a similar thing with their string literals, which are immutable even though normal strings aren't.
I strongly believe it, in fact, just as I'm writing this I'm not sure what a language like PHP would print out in that example (maybe the latest versions do the "right" thing, but back in PHP3 and PHP4 times variable scoping was a mess).
void Main()
{
string s = "foobar";
Foo(s);
Console.WriteLine(s);
}
void Foo(string s) => s.Substring(1, 2);
then this example behaves differently from the x one. Unless you copy strings on function call, which is potentially more expensive.I'm a bit twiddler from way back - my first love was 65C02 assembly language in the mid 80s and my 2nd love as a professional was C for 12 years - but until I stopped considering myself as just someone concerned about code and learning how to efficiently deliver business value, my career suffered.
I take advantage of as many third party libraries and abstractions as possible. I try to use cloud solutions as much as possible (Lambda, RDS, SQS, etc.). In the market where I live, React/Angular + NodeJS jobs are a lot more plentiful and pay more than C jobs. Also, being able to leverage "abstractions" like AWS/Azure functionality is a lot more marketable than knowing how to setup everything yourself.
I'm the type of person that likes to learn deeply about my chosen platforms (C#, JavaScript, AWS,Mongo, SQL Server) just because I'm a geek, but the money comes from knowing high level architectural concepts.
I've had 5 jobs since 2012 and only once did I have a coding test (pair programming on a computer).
So 4 jobs since 2012. I was off by one. I make 45K more now than I made in 2012. Because salary compression is real, the easiest way to make substantially more is by job hopping.
I wasn't early in my career - but in 2008, I had stayed at a company too long and between measly raises and bonuses being cut, my salary was barely keeping up with cost of living.
I pivoted more to being a C# "Enterprise Developer", got a job paying a little more in 2008 as a junior C# developer. Learned a lot, that company folded at the end of 2011.
Next job was as a Mid level c#,web developer at major at the time Fortune 10 Company, learned how big companies worked and learned how large projects were managed.
Three years later, companies were offering 25K more for "senior developers" than I was making in 2012. With the combination of new skills and having a big company on my resume, it was fairly easy.
Two years later, I was applying for a job as an "architect" making another 13K more than I made in 2015.
Now startups are recruiting me, because I both have the experience and the technical knowledge as both a hands on coder and leading team.
Invariably, those scripts found invalid data, which pointed to hard to spot bugs. Catching those early saved me from having huge amounts of invalid data to manually sort through.
Now, when a device is linked to a user, both should be on the same organization, right? I don't see how to easily do that as a constraint (but I have to admit my SQL skills is quite low, and I avoid bypassing the ORM). Well, in production, devices might land somewhere else, and now you have a device that is supposed to be on organization A which is linked to a user on organization B, if you didn't force the organization when a device is linked to a user.
Depending on your use case, it could be expected, an operational error, or something that should be resolved automatically.
Edit: another example. We have a legacy system. Part of the data is supposed to be mirrored on both new and legacy system, via API calls (I don't know of a better way, I'm not a great dev, DB are different, not shared and on a different provider). Well, check if they are actually the same from time to time (at least the obvious stuff).
I'm not exactly an expert when it comes to SQL either, but in this case wouldn't it be better if the "Device" table had two columns: "UserOwner" and "OrgOwner" which in turn have FK connections to "Users" and "Organizations".
If the logic is that every device is only owned by a user or an org (never both) at any time, you could constrain: check(UserOwner is null or OrgOwner is null).
Now it is: No Internet = No Coding. Then: No Internet = Who needs this shit?!
A good programmer is someone who can see the architecture of a program when given a high-level description of the problem. Someone who I can realistically tell "write me a program to backup my files" and will end up writing a reasonable backup system. Someone who I can task with coming up with an application protocol with certain constraints. In short, someone who can be an artist, engineer or scientist depending on what is needed.
Good practices are largely irrelevant to being a good developer, you can be a good dev writing spaghetti code and a bad dev using TDD and OOP.
I've always found this a pointless exercise since I can get the answer I need with a quick Google search. After working with a language or library for some time, most of these things become muscle memory.
Rather than making a conscious effort to remember all of these things, I let my brain unconsciously decide what's important enough to remember.
At work I usually go by looking for quick solutions for the very specific problems I encounter, e.g. disable echo on a terminal, send data through a socket, ...
And what I sometimes do over the weekend is to go over the problems I had and try to learn from the subject in a more generic way. e.g. learn TTY inner workings by reading the source code of python's pty.py standard library module, read the socket's documentation and understand all available socket operations, or watch some conference talk on the subject over youtube ...
This second consolidation phase has proven very useful to me. Not only because of discovering interesting gems hidden in standard libraries and other references, but also to be able to anticipate and solve really weird/low-level bugs that otherwise would have been very difficult to approach.