Its not that all users are devs. Its that all devs might not be able to make their software work well under that environment.
211 karma · joined November 11, 2012
Its not that all users are devs. Its that all devs might not be able to make their software work well under that environment.
The fact that we're talking about ARM makes this even more important. You're having to compete against x86, which requires increased core counts, and a lot more optimization and potentially even redesigns of your software to make your higher level environment to be perceived equal to x86. Businesses will need this, your boss will ask if ARM is as fast as x86 and they won't care to quibble about technological differences if you can't just get the same output speeds as their old, trusted hardware. There is only so much your language can do to cover your butt. At some point you'll have to be aware of your environment to compete.
The second realm was languages that I picked purely because they filled a niche better than anything else. Often these were side projects, or tooling, or things that I could sell based on how quickly and efficiently I could get up and running with X language that would save us money even if we eventually had to replace it if no one learned it.
I used F# for big data processing because I am an FP guy and they wanted .Net and I could do data manipulation like nobody's business. I used tcl/tk because I needed a super quick and dirty UI for tooling that I could quickly update to add new features. I used Racket when meta programming would hugely benefit me.
The problem is that for a lot of our jobs we are stuck with realm 1, the things we can't change. This is the area where we end up pitting languages against each other because they end up used way more than realm 2. You have to push really hard and hope someone listens but more often than not you just keep on doing what you're doing.
I worked on a huge JVM based project and even though no one in the company knew Java there was just no selling upper management on using Clojure. FP would have reduced complexity, meta programming and dynamic code generation would have made it much more robust without a lot of effort, but it was just too foreign (or at least not advertised as being used in places well enough), too new, and when you Googled it the "major" issues developers had scared everyone.
This is when my second shift starts. I pick up the kid's area, clean the kitchen, dishes, laundry, and whatever other stuff is left over. After that I do another 2 to 4 hours of work depending on when things are due, late to the bus, early to leave because of family stuff. In bed somewhere between 1am and 4am.
I keep track of my life in todo lists. Got a notebook and a pen within arm's reach at any given time. Zero Inbox/Bullet Journal/GTD my entire life, work and personal. I also naturally do sort of a pomodoro technique with everything. Breaking it down into smaller parts so I can cover as much space as possible. Cleaning the kitchen turns into two separate tasks (dishes, and cleanup) which I then inject 10 minutes with the wife or kid in between. It probably adds more time to my overall day, but I can't push their schedules later and I need to get work done so I can't push my duties to later either.
The other "trick" is I've never needed a lot of sleep so I can do stuff later at night once everyone is in bed. Sleep on the bus, or whenever I have a free moment.
My previous job was within biking distance so that was my health management. Now I have to ride the commuter bus so I'll have to figure something out once the 2nd kid comes.
I had a boss who thought it would be useful to track line of code changes per developer, number of features implemented and bugs fixed weighted by original estimates and other non-useful metrics to grade employees during their reviews. I was asked to implement the tools to scrape that info.
So what did I do? I used the same metrics and automated my todo list to make sure that I was always in the top 1% of the results. Since I was a lone wolf on a massive multi-year project it wasn't hard to find stuff to do. But when I got to the end of the month and it was trending to show I wouldn't drop a spot my scripts informed me that I was done working. I would also prioritize the level of effort to time left in the month. So if there was only two days left I'd pick up more small tasks to pad my output rather than taking on a bigger task I wouldn't complete in that month.
I started doing this after having been there 10 years. 10 years of me doing other jobs that were not mine "for the good of the company." 10 years of me traveling when travel wasn't part of the job. During this time having great number not much happened with regards to compensation. I went from being a team player to doing just as much as I needed to.
When I finally left and had my exit interview one of my managers noticed my marks were always top 1%...even in months when the company's total output was shitty. Since I was on my own projects there was no reason why I would have had a dip when other divisions dropped. So I asked, "if I had output 30% more than any other group...would you have given me a 30% raise? a 3% raise?" He said, "no we probably wouldn't have done anything beyond the standard cost of living increase."
And after spending years doing embedded systems, industrial control, communications...I was pretty much the opposite of a Web/Mobile developer. Trying to get a remote gig while having none of those skills was difficult (yes there are other industries that can do remote too, but what I was "good at" was not remote friendly tech). I had to create a side job, make a real world project and go around showing that I knew the tech just to get my foot in the door to places that would allow remote work.
The way the place was run I was expecting one of them to suggest I just skip lunch.
Doing my exit interview I stated that the reason I was leaving was because management had this goofy view of the world and it was the reason why we struggled finding talent. They felt that because there was no physical competition in the area they could pay a fraction of what their competitors in the field pay and still retain talent. They also felt that it was appropriate to create a convoluted scheme where you could never really get a promotion, just be given more responsibility w/ almost no increase in pay. (You can only move up a level if you have 1 or fewer "needs improvements" while the managers were told that all employees should have no less than 2 "needs improvements" as they should have things to work on over the coming year).
Most people I talked to about that whole situation would offer the "well why didn't you just move" advice not understanding that the pay was just enough to pay for room and board, college loans, and then choose to put the last few dollars into a 401k or into savings to escape that job. I opted for the former hoping I would work my way up to not have this problem. I made the wrong choice.
To load up a 25x80 area would give me all sorts of bad characters. Doing single lines, and find and replace made it almost feel like I was right next to the hardware.
Yes and no. I think a lot of of this automation will mean we will be going back to the world of trade schools where repair becomes a lot more important. Same goes with installation of these automated systems. The US loves to push "shovel ready" construction jobs but we should be focusing more on training for installation and repair of automation.
I've found it kind of odd that we've lost a lot of the trade skills being taught in high school. I'm in my mid 30's and I'm the only person my age I know who took classes in Small Gas Engines, Carpentry, Electrical, Plumbing, etc. From that point a lot of kids went right on to get Journeymen certs and many now own their own businesses. If they would bring those classes back and also teach these types of skills to those underemployed I think you could easily transition into any type of related field.
As for the teaching part, I have found the best results by having you and the learner actually "working" on the project at the same time on your own machines both pushing to a centralized server. It becomes too easy to go over all the commands and feel like you understand it. Most of the scary parts of git are used when its multiple developers on the same project. And oddly enough, having the learner do both Developer A and Developer B's tasks don't seem to work as well as having the learner just do Developer B while I do Developer A. Trying to explain to someone when to use merge, when to rebase, and when to use cherry-picking to get the code I just pushed into their current working branch can be done so much easier when its hands on AND knowing exactly who is doing what steps.
What needs to be added along with being paid for existing, is training and potential job opportunities to be setup to get them off of the system. I think that most people in these programs would have no issue being given the ability to work. The major issue with be with people who will object to getting jobs they are "too good for." Hopefully those people are few and far between.
Everyone feels like X language is so great but if only we could add a feature from Y language to it. They then attempt to trivialize what is needed for that feature not realizing that the benefits of Y are due, in part, to the non-trivial amount of functionality. They almost always turn into a façade of the feature they truly want to support and they never gain traction because their usefulness just really isn't there.
I was formally educated to do low level development, did operating systems, hardware design, and communications for a living for 15 years. During that time I also learned and regularly used FP, data processing, windows GUI, full stack web development. Every year I pick a new tooling language so that I'm not completely tied to one language or paradigm. Every time I have an opportunity to use the right language or tool for the job I learn it and use it.
The whole point of my education process was not to learn C and Assembly, it was to motivate me to he constantly learning. When I wanted a new job I created a "real world problem" to solve, did actual design docs, took courses online, read books, etc. Was able to get a new job in a completely different field, doubling my pay and reducing my work load. That's all due to the fact that if I had a list of stuff I didnt know I'd be out there learning that stuff every waking minute.
The real place to make things more custom is when you can do small and stick the computer in places it would not normally go. Raspberry pi or a micro atx in the glove box of your car kind of thing.
So if I got this right SD says the task of collecting taxes from those who reside in their state is not possible for them to do, and unless they honestly think it would cost the vendor $0 to perform this task, they are imposing additional cost of doing business when they provide no services to the out-of-state vendor.
When you drive through Ohio you are using services paid by Ohio citizens. The gas you buy had to drive on state roads, cleared of snow by state plows, and sold to you by people who use other state services. Since you don't live there and are just using their services I think it's perfectly reasonable to be taxed.
But what if you never stepped foot in Ohio? What if sent a box in the mail, using the FedEx who charges you money for their services, pays taxes in the states they physically exist, pay for vehicle licenses and property taxes and income tax. All of which comes out of the fee I'm paying them. Has SD gotten enough money from me yet? Still haven't actually used any services that aren't consumed by the one thing I'm doing and paying for, shipping a box
The employees that work in Ohio get to vote, get to have protections by Ohio government, get access to services. The businesses get protections too. And yet I, the vendor, who lives in a completely different state, and never uses a single service of theirs beyond those required to ship a box (odd that there is no extra taxes on sending a letter USPS) is then required to do ohio's job of collecting taxes, and pay any that I miss collecting or am charged a fine. Sounds to me like Ohio is requiring me to fill a job position I did not previously need or else pay a fine. That is all money that now goes to someone else because Ohio says so. Could have sworn that is taxation.
And as for voting rights, I think everyone is disregarding the fact that employees vote. If a referendum came up that would make their job harder or even make it impossible, the employees get to vote on it. Not saying they wouldn't all vote the way the company wants, but their are votes cast for defending their livelihood. Since my company has no physical presence I don't have that same representation. Yet I'm again still required to do everything an in-state business is required. I had none of these issues when my business only existed in the state I live in. And where I and all my employees vote.
This all sounds like my one man SaaS site now needs to have employees and keep extra book work for states I will never physically be in and who doesn't feel they need to hirden their citizens with actually paying their taxes. That should count for something.
So if I pay South Dakota sales tax then I should be able to contact state representatives, should be included in votes for any state referendums that affect my business and should basically be considered a citizen of that state. Otherwise I see it as taxation without representation.
But I've found that lots of places seem to be focused on if you know X rather than being a well versed, developer who enjoys growth. And it feels more and more like the reason is because they don't expect anyone to stay there for more than a few years tops.
It's not about avoiding the goto like behavior. It's about making you to know it exists and forcing you to handle it.
Rathet than throwing 5 calls deep, doing nothing until you empty your call stack, you must explicitly say "I know I'm part of a system that may error" at each step along the way.
You also know what type the error will be. No need to derive a new class from `Error` and add custom functions to extract the data from your failure case, just pass the data along.
In most other languages you either don't know if an exception could be thrown or you just assume every function throws one. Then when you are adding in things like promises which explicitly define success and failure paths the system must implicitly catch all exceptions and pass them to your error path...unless the developer chooses to change that functionality.
Much nicer to have all that defined for you in the type system, even though it existed without it.