Wednesday, December 14, 2016

How to Really Pay Programmers Less
By: Larry Eisenstein

About a week ago, I was perusing my Google news feed on my phone and it was an article that was titled, “How to Pay Programmers Less”.  Naturally, I was intrigued, so I clicked the link and began reading.  As it turned out, it was a satirical piece that took some of the most popular ‘gimmicks’ companies are using today to pretend like they are modern, hip and cool and saying they could use these cheap ‘perks’ to get developers to accept less pay.  Ha….ha….  It’s funny because there is some truth to it.  The article was by Yegor Bugayenko (http://www.yegor256.com/2016/12/06/how-to-pay-programmers-less.html).

So, I thought I would write a counter article describing how you can REALLY pay developers less.  This won’t work with all developers because some are only concerned with the bottom line, but a surprisingly high number of others will take less.  My theory, counter intuitively says it’s some of the more experienced developers that this will work with.

Training
Some developers really love what they do.  So much so that they actually spend their own time (and money) cultivating their skills.  Training is so inexpensive these days, there is very little reason NOT to pay for this.  Have a couple open memberships to sites like PluralSight, Udemy, Lynda.com, and offer time off if there is a local conference.  This will only cost a few hundred dollars and will pay off in loyalty and increased productivity.
Also, promote learning by encouraging Meetups, pair programming, lunch & learns, and mentoring.  Don’t allow overzealous employees to step new programmers.  Base senior developer appraisals on how well they mentor junior programmers.  If a developer improves their productivity an amazing 10% every year, this would pale in comparison to a developer that could improve all his colleague’s performance by 2-3% per year.  This would be like the magic of compound interest, but for work productivity.

WFH
Working from home is becoming a huge deal.  It’s getting so big, many developers are skipping companies that do not have at least some sort of regular WFH policy in place.  Employees spend countless hours in traffic and are then expected to produce great code, in high stress, frantic, loud environments.  This is so insane and some developers have realized they are less stressed and produce more and better code when they are in the comforts of their home office. 
This is a no brainer.  You get happier, more productive employees and you can save money on office space too.  The draw back?  It does take a certain level of trust and good management to handle this.  You must be willing to punish or terminate any employee that takes advantage of the policy and resist the easy, knee-jerk reaction to take it away from everyone.



Appreciation
This is a big one and it’s not something you can find out about an employer during an interview.  Show appreciation to your employees for good work.  Go overboard in your praise and look for things to praise people about.  Don’t play favorites, just dole praise out to everyone that does a good job.  Don’t hold out to the end of the year; praise early, praise specifically, and praise often.  This is really where Dale Carnegie got it right in his book, “How to Win Friends and Influence People”.
Listen to and implement suggestions.  You are paying smart people a lot of money.  Why are you not taking and implementing their advice?  Because it will take a little time or money or you found one drawback after seeing 10 benefits?  Everyone understands not all ideas can be implemented, but if you continuously hold back (or even worse, take credit for) ideas, good people will leave.  Don’t get stuck in this trap.

Tools
This is probably one of the cheapest ways to increase employee morale and productivity at the same time.  Why are you frustrating your developers by giving them slow, outdated machines and not providing them with software that will make their jobs easier and more enjoyable?  There are tools out there that cost less than $100 and can literally save days of manual labor.  Why are you paying developers $100k or more and then having them spend 3 days writing some software that has already been created and can be purchased for $49?
Also, buy your developers good machines.  There is nothing more frustrating than writing some great code, and then having to wait 2-3 minutes for the test tools to start or for the website to come up.  For an extra few hundred dollars, you can have happier more productive developers.  Considering this machine will last 3 years, this is a inexpensive investment.

Environment
Joel’s Rule #8: Provide your developers with quiet, distraction free environment.  Joel describes the issue, so I won’t rehash it (https://www.joelonsoftware.com/2000/08/09/the-joel-test-12-steps-to-better-code/).  This problem is getting more serious with these idiotic “open space” office designs and unfortunately managers are eating this crap up.  They see they can fit more employees in a smaller space and then they allow some dumb consultant to convince them that this is a collaborative environment.  This might work for some types of work, but I’ve met very, very few developers that are OK with this setup.  We are though workers and we need quiet time to think.


Ok, now that I have gotten that off my chest, let’s take a slight detour back into reality.  I’ve been around long enough there is no magic “employee satisfaction” pill and some of these things are harder to implement than others.  I doubt there is a workplace out there that does a great job at all of these things, all the time.  But, if you can do 2 or 3 items from this article, you are WAY ahead of the game.  The great thing about these suggestions is they are not expensive (some even free) and it will make employees happier and more productive.

Sunday, September 13, 2015

HackHands Review

Recently, there seems to be several companies appear that are offering developer help and mentoring services.  I've been wanting a service like this for a long time since I've never had the opportunity to work with a mentor or even work with a more senior developer at any of my previous jobs.  This is a great idea and I wanted to fully support any company that would offer a service like this.  Since there aren't many reviews out there, I decided to try a few companies to see who I liked the best.  I started with HackHands since they were bought by PluralSight, another company I use for training videos.


Initial Sign Up  

Once you sign up, you can purchase credits that can be used to purchase time with an Expert.  Their dashboard is very simple and it seems you only have one way to interact with their Experts.  You put in a request with a description and the category (language) along with some tags.  You can then choose the maximum rate you are willing to pay.  Since you pay by the minute, you can choose anywhere from $1/minute to $5/minute.  They notify their experts that accept $1/minute and if no one responds, they move up the scale until they hit your max rate.  You have no way of searching for Experts or choosing a specific Expert unless you have worked with them in the past.  

They offer a 'Test' setup of your environment with the screen/video sharing software so you will know it works before scheduling a meeting.  This is supposed to make sure there are no technical difficulties once you start the meeting since you are paying by the minute and as soon as you connect, you are billed according to the timer.  I went through the process and everything seemed to be working fine.  The audio and video on the test were very high quality and I installed all the appropriate plugins.  Also, if you cancel within 5 minutes, you do not get charged.


Experience

My first experience with HackHands was mixed.  I am new to EF and Async programming and I had a simple problem with some code and I needed some clarification on how to use Async/Await.  I put in a request describing the problem and I was taken to a 'Wait' screen while they sent the request out.  While you are waiting, you can play a game or they have some sort of Desktop notification application you can install.  The screen said it might take up to 15 minutes to find the Expert.  They found someone for me in about 10 minutes and the session timer began.


Once the session began we started having some technical issues with audio.  I think it may have been with him having a laptop microphone and a headset microphone, but I'm not sure.
Our session was 13 minutes at $1/minute.  I would say a good 6 minutes of this time was spent trying to hear/understand each other and get the screen sharing done correctly.  We never got the audio issues completely fixed, but it was good enough to hear if I closed the door, listened carefully and asked him to speak up.

Once we got going, he was able to see what I was doing wrong in my code and helped me fix it immediately.  Then he gave me some background into async/await, but because of the audio issues I only got about half of what he said.  Over all, I was impressed with the Expert, but not happy about the connection issues.  Seeing that we had those issues, it would have been nice if he had 'Paused' the timer while we were figuring out the audio/connection issues.

After finishing the session, they asked me for a review.  I mentioned the technical problems, but their response was I should have stopped the session before the 5 minute mark so I wouldn't get charged.  I did not do this because by the time we got to 5 minutes, the problem was almost resolved.  I think this was poor customer service, but to be fair I was not using my own money.  I had received some free credits by signing up during one of their email marketing campaigns.


Conclusion  

I was pleased with the knowledge of the Expert, but technical problems and mediocre customer service made this a mixed experience.  Also, I don't like that you have no ability to pick/choose experts or even review them prior to the match up.  They could have great Experts available, but you may never get to talk to them because all their low level 'experts' keep accepting your request before your bid gets high enough for a real 'Expert' to accept it.  Also, their service seems to be focused on one-time, by the minute interactions.  I'd like for them to have an hourly rate where YOU could choose the Expert and not worry about the clock ticking away.

Thursday, November 21, 2013

9 Killer Questions to Ask an Interviewer

  1. How would you describe the general culture of the company and the workplace?
    • Personalities at a company are important.  If you don't like your co-workers and how management treats their employees, going to work will be painful.
  2. Why did you choose this company?
    • This is a good, subtle question.  Does the interviewer pause, or answer quickly?  Are they enthusiastic/passionate about the answer, or does it take them a while to fumble through an answer?  If they have to think long and hard to come up with something good about their company, this can be a red flag.  If you've ever worked at a company you were passionate about, you will be able to answer this quickly.
  3. Will there be any form of training provided?
    • With diminishing training budgets, its nice to work for a company that provides more than a log in to a site that provides Word and Excel training videos.
  4. What are some of the biggest challenges/successes facing the department currently?
    • This will help you understand the culture and see where you might face some hurdles in the future. 
  5. What process will be used to evaluate my employee performance?
    • It's good to know up-front, how you will be graded on performance
  6. Who will be my direct supervisor?
  7. Are there many opportunities for professional development within the company?
    • Again, training and being able to work with new technologies may be important to you.
  8. What is the usual time frame for making the hiring decision?
    • Everyone should ask this to show interest in the position and let them know you may be on the market for a limited time.
  9. May I contact you if any further questions arise?
    • It's good to follow up and try to remember the names of key people.

I'm adding a few questions of my own that will help determine if this is a job you really WANT
  • What causes you the MOST frustration within the company?
    • Try to find out where your future frustrations are going to come from and is it acceptable to you? 
  • If you could change 1 thing in the company (that would not cost a lot), what would it be?
    • Try to gauge how happy their current employees are.
  • Can you describe an advantage to working for  this company that you have NOT had at previous employers?
    • Again, the employee of a good company can quickly rattle off a few things.
  • As close as possible, describe the "perfect" personality traits of a candidate you would like to hire.
    • This question will help you determine their expectations for you.
  • Describe some of the personal traits of former [or current] employees that you do not like.
    • This one will 'really' let you know what their pet peeves are and help you determine what they really want in an employee.  If they mention they hate 'clock watchers' or they don't like to 'hand hold' people through learning, that "could" be some clues to issues they have had with previous employees that they will be sensitive to.

 

Wednesday, October 2, 2013

Developer Take Aways from Monster and CareerBuilder Access


I've had this posting in a Word document for a while, and finally, I'm getting around to publishing it.  A while ago, I was involved in the searching and recruiting of a new developer for our group.  We were given access to Monster and Careerbuilder to facilitate the search since our HR department had no clue how to sort out all the skills we were looking for.

Well, it was an eye opening experience, and I thought I'd share a few things I learned from this process.

1.       Make a small change to your resume every week to stay on top.  The default filter works by how recently you have updated your resume.  Usually, people will choose resumes updated within the past week, month, or 3 months.
2.       Put some buzz words in your Monster profile, if you have any decent experience (NOT in your resume, which I’ll talk about later).  It will get you more hits, but some of the hits may not be jobs you want, so carefully filter out jobs that don’t fit your skill set.
3.       Put down some lesser known technologies you’ve worked with in case someone wants to key in on that technology. (Like DotNetNuke, Mojo Portal, Kronos, etc).  A company may not be looking for a Mojo Portal developer, but if you know it, they may view that as a bonus and choose to give you an interview over the other 10K .NET developers out there.
4.       It’s hard to search by experience level and/or salary, so don’t feel the need to put salary requirements.  Use your title to let people determine that (like Junior or Senior).
5.       Make sure you have a descriptive  title and a target job title.  I can’t tell you how many resume’s I skipped because it said, “Joe Smith’s Resume” and had no target job title.  Monster is VERY slow at times and sometimes I just didn’t want to click on the link because I know it takes so long to pull up.
6.       Some companies want a Mid Level [or Senior] developer, but find out later that they can only afford a Junior Level [or Mid Level] person.  Don’t let titles scare you away, but be up front about your skills when applying for these jobs.  Be completely honest and transparent about what you have done and what you have not done.
7.       Recruiter fees DEFINITELY play a role in a hiring decision.  I personally know that I lost out on a position because the other candidate applied directly.   If you come from a recruiter, there is a 20%-25% markup.  You may be better than the other person, but if you are going to cost the company about $15K- $30K more (for similar skills), that can be a deciding factor if its close.
8.       Keep your certifications up (if you can), because when all else fails, acronyms are easy to search on AND the person doing the searching may have no clue what they mean.  You can tell me 100 stories about how certifications mean nothing, but for me it does three things:
a.       Gives me an easy way to search for a developer vs. some guy that knows the keywords I am searching for. (I’ve seen so many DBAs put Java and C# on their resume because they took a class in college or wired up a DataGrid to a table on a WinForm one time).
b.      Tells me the person is somewhat dedicated to their career.  Dedicated enough to study a book and take a test.  I put this in the same category as people that attend user group meetings for a particular technology.  You may not know much, but at least I know you care about your career enough to dedicate your own time/money to get the certification.  I know plenty of developers that go home and never touch a computer and have no side projects (a minus to me).
c.       They may just be learning monotonous details, but I’ve run into situations where a senior network engineer didn’t know a lot of the details of security policies that an MCSE would have known (and it ended up wasting 2 days troubleshooting a simple issue because of this).
9.        A cover letter is NOT important on Monster.  At least in my experience.  Disagree if you want.
10.   Get a skill that NOT everyone has.  There are a million .NET programmers out there at all levels and for all salaries.  So, learn some stuff like Perl, Python, RoR, Grails, Scala, etc.
11.   If you are a Web Developer, have some sort of public website, even if it’s just an online resume (and try to make it look decent).  I can’t believe you’ve been building websites/web applications for 6 years, but you’ve never created a public website.  That just shows lack of ambition.
12.   Putting special characters ( like the accented ‘e’ on Resume or a ‘tilde-n’ if you have a Hispanic name) in your resume’s file name can make it so it cannot be opened on some computers.
13.   Key in on some business terms to get Managers to take notice.  In healthcare, you could use: EDI, HL7, PQRI, etc.  We all know computers don’t care about what data they are displaying, but this excites managers to know that you may have some knowledge of their field that you can share with them (or that they don’t have to teach you).
14.   MOST IMPORTANTLY:   Don’t put things on your resume unless you can answer questions about them.  Use your Monster profile to add keywords/buzz words, but don’t put them on your resume because I’m GOING to ask you about them (while you are in front of me).  If I ask you a question about something on your resume and you can’t answer it at all, that makes you look like a liar.  I’d rather teach someone how to program than teach them how to be ethical.

Friday, May 31, 2013

Fixing CORS issue in Web API: "Origin is not allowed by Access-Control-Allow-Origin"

For security reasons browsers prohibit AJAX calls to Web API service outside the existing site. This means you can't provide a service exposed by Web API to a site on another domain. This is called Cross Origin Resource Sharing (CORS).

This problem should be resolved in .NET Framework 5 and I've found several articles on how to incorporate "Nightly ASP.NET Build" feature into your existing Web API service.  I'm not really comfortable with that and it can be hard to get it working properly. 



All you have to do to fix this issue is add a few lines to your web.config under the system.webServer:





   1:  <system.webServer>
   2:     <httpProtocol>
   3:        <customHeaders>
   4:           <add name="Access-Control-Allow-Origin" value="*"/>
   5:        </customHeaders>
   6:     </httpProtocol>
   7:  <system.webServer>

Wednesday, February 27, 2013

DNN Manage Button Hidden Behind Another Module

There is one issue I've run into several times with DNN and that is an HTML module covering up another module.  I had this issue with the Dark Knight skin.  An HTML module I had on the ContentPane was covering up the dropdown menu, so I had to make some CSS adjustments to the z-index property.

The issue I have now is slightly different.  I've written several modules that either:
  1. Do not display anything in the View (they work in the background), but you still need to access the Settings to make changes
  2. Do not display anything in the View if there is no data
The problem is if you are in Edit mode and nothing is being displayed, you cannot get to the Manage button because it is 'behind' the Manage button of the module below it.


I've come up with a simple fix for this that I include in my View.ascx file:


<% if(DotNetNuke.Common.Globals.IsEditMode()) { %> 
 
<div runat="server" id="showIfEditMode" >
   <br />
   <br />
   <br />
</div>
 
<% } %> 
 
 


This adds some padding below the module when you are in Edit mode. That way, your Manage button will be visible even when there is nothing to display.

Monday, February 11, 2013

Sorting ArrayList with Linq

This was my first forray into Linq, so I thought I'd post it in case I need it again in the near future.

I needed a list of user to populate a DropDownList.  In DotNetNuke, you can get an ArrayList of all users on the system with a call to: UserController.GetUsers(int PortalID).

The problem is the list is sorted by UserID, so when you open the DDL, you'll see all the users in what seems to be random order.  I wanted the list to be sorted by LastName, FirstName without having to write some sort of IComparer.

This is a great use case for Linq ( I've heard a lot about it, but never used it).


ArrayList a = UserController.GetUsers(0);
var so = from UserInfo s in a orderby s.LastName,s.FirstName select s;
            
ddlUser.DataSource = so;
ddlUser.DataValueField = "UserID"; // Alias Name from Sproc
ddlUser.DataTextField = "DisplayName";   // Alias name from sproc
ddlUser.DataBind();
ddlUser.Items.Insert(0, new ListItem("Select One", "0")); // Adds items to DDL


If you are using a custom object (ie UserInfo), then you must explicitly declare the type.
When using LINQ to query non-generic IEnumerable collections such as ArrayList, you must explicitly declare the type of the range variable to reflect the specific type of the objects in the collection.