Home Blog Page 27

How to create accurate freelance bids


I like to call today Freelancer Friday because each Friday I cover different tips for freelance developers and today I’m going to discuss how to create accurate freelance bids.

Being able to give good estimates is one of the most critical tasks you can do as a freelancer, if you quote too low you’ll end up with an angry customer because, even if you did great work, he’s having to pay more than he budgeted. And if you bid too high there’s a good chance you won’t get the job and the potential client will go to a competitor who gave a lower bid.

Through the years I’ve been guilty of erring on both sides of the spectrum and I’ve had to deal with the consequences, and they were not fun, which is why I’ve put together a formula that I follow for building bids.

  • Get a detailed drill down of the project requirements, without this you won’t be able to create an accurate bid no matter what else you do. Imagine if an architect had to give an estimate to a client who said, “I want a nice house with a cool fence”, he wouldn’t be able to accurately estimate how much the house would cost to build. An architect will get a detailed breakdown on: square footage, number of bedrooms, along with a list of all of the bells and whistles. In the same way you need a detailed breakdown of every feature that the application needs to have.
  • After you have the list of features, break them into categories, such as: database setup, front end design, user permission configurations, etc. and then put each of the features into one of the category ‘buckets’
  • Put all of the data into a spreadsheet segmented by the categories you created in step two.
  • Give a conservative estimate on each feature in the spreadsheet
  • Have the spreadsheet tally up the total hours or cost and that is the project estimate

Does that seem like common sense? Good, because creating accurate freelance bids should be a simple process. If you came up and asked me how long it would take to build a payroll system I wouldn’t have a clue what the bid should be. However I do know how long building a user database will take, and I know how long it will take to implement the design, etc. And by breaking down the project into small, specific chunks I’m now able to feel more confident about how long the individual features will take to build.

I also update the spreadsheet as I progress through the project. That way I’ll actually have a guide for future projects, for example if I originally estimated that building a video upload feature would take 8 hours but it ended up taking 14 hours I will be able to more accurately estimate that feature in future projects.

I hope that this has been a helpful guide for learning how to systematize your process for creating estimates as a freelancer. I’ve also attached a sample spreadsheet to the resource section of this post that you can use as a template for your own projects.

Freelancer Resources for Accurate Freelance Bids

Accurate Freelance Bids

Paper Piracy in Academia


On Thursdays I like to discuss an item in the tech industry and today I’m going to cover something near and dear to my heart: academic literature piracy. The magazine, Science, published a long post this past week that showed that not only is academic paper piracy a growing fad, but it’s reached some significant milestones. In the month of February alone the popular piracy site Sci-hub had over 6.2 million pirated paper downloads.

First and foremost, I’m not ever going to ever promote the theft of anything, be it scientific research journals or Taylor Swift MP3s, in my mind you can rationalize it all you want but theft is theft and I don’t see very much grey area in the matter.

With that being said, I’d rather discuss if the entire industry of academic publications is set for significant changes. As a computer science grad student I can tell you from personal experience how difficult it is to research scientific papers. The current process is:

  • Search for a paper on a search engine, such as Google Scholar
  • Read the abstract to see if the paper is a good fit for whatever paper or project I’m working on
  • Then go find the journal or conference that the paper was published in
  • Sign into my University account so I can go through their publication portal since all of the journals and conferences store the papers behind very expensive paywalls
  • Cross my fingers and hope that the paper I found is available through one of the channels that my university has paid for

If all of the items go smoothly above I can download and read the paper

Does that seem like a process that needs to be disrupted? I definitely think so. There are countless ways that the industry could be modified to make the research process more seamless, some of my recommendations would be:

  • A practical membership program, aka Netflix for academic papers.
  • Making all journals ad supported to users with verified ‘edu’ email addresses
  • Making all papers free and placing them in an ad supported search engine, aka Google, where the publishers share the revenue based on usage

Just like the movie and music industry, academia isn’t going to be able to continue charging outrageous fees for access to content that should be freely available and they’ll have to adjust or the rampant piracy is simply going to continue to grow and they’ll eventually be left with nothing.


System for Learning a New Programming Language


On Wednesdays I like to cover a random topic for developers and today I’m going to talk about how to learn a new programming language. I’ll walk you through the five steps that I use whenever I’m learning a new language or framework.

Over the years I’ve been hired by organizations such as Learn.co and AppDev to write programming curriculum for:

  • Ruby on Rails
  • Ruby programming
  • Python
  • Java
  • Several JavaScript frameworks

The only language that I really build applications in is Ruby, which means that I’ve been forced to become proficient in a number of language that I really didn’t have much experience working with, sometimes in a very short period of time.

And over the years I’ve developed a system for learning a new language or framework and that’s what I’m going to walk through today.

When I’m learning a new programming language I follow these steps:

  1. Watch a full tutorial series on the language, when I’m watching I don’t try to follow along, I simply watch what the instructor does in the demos so I can get a high level view of the language syntax and flow.
  2. Create a hello world application, I’ll incorporate a few basics, such as running a loop, creating and instantiating a class, and any other high level concepts I remember from the tutorial.
  3. Pick out a sorting algorithm and implement it in the language. It’s fine if the sorting algorithm is a basic one like selection or bubble sort. Sorting algorithms force you to use: data structures, loops, variables, and functions. Combining each of these elements will give you a good handle on how the language works.
  4. Go through an advanced tutorial on the language and this time follow along and build the programs with the instructor.
  5. Go through coding interview questions for the language. Being able to confidently answer these questions will give you a good idea if you have a solid understanding of the language.

I’ve used these five steps for a number of languages and I can also tell you, once you’ve become proficient in a single language you’ll find it’s much easier to pick up new programming languages since most of them have quite a bit of shared processes and all you’ll need to do is learn the difference in syntax.

I hope these tips will help you learn a new programming language, please feel free to comment with any other methods that you’ve found helpful when learning, and good luck with the coding!

Interview Question Tip: Explaining the Quicksort Algorithm


Welcome to Interview Tuesday where I discuss different ways to prepare for landing a programming job. If you’re interviewing for a developer position, one of the more intimidating questions that you can be asked is to explain how the Quicksort algorithm works. It’s a popular interview question by companies such as Facebook and Google, so I thought it would be a good one to cover.

Quicksort is one of the most popular sorting algorithms used by programmers due to it’s performance and space efficiency.

Here are some facts to know about Quicksort:

  • In average cases it has a performance of O(n lg n), if you are unfamiliar with the Big-O notation, just know that O(n lg n) is one of the best performing algorithm speeds for any sorting algorithm
  • It’s worst case performance is O(n^2), this is very slow, but rarely occurs
  • It is not a stable sort algorithm, which means that the original order of the elements is not preserved. As an example this would mean that if you placed multiple 5’s in an array, there’s no way to guarantee that the 5’s will all be in the same order that you placed them in the array after it’s been sorted, as shown here.
  • It is in the category of divide and conquer algorithms. Divide and conquer is a category of algorithm where the main task is broken into a set of smaller tasks and processed before putting all of the components back together at the end. I like divide and conquer algorithms because that’s also how I like to learn, I like to break down a difficult topic into its smallest, most easy to understand concept and then work my way up to advanced techniques.
  • One of the most important items to remember about Quicksort is that it uses a pivot element to partition the data set up into smaller pieces. And it does it over and over again until the full set of values are sorted.

The algorithm takes the following steps:

  1. Picks a pivot element, usually you’ll select a random element as the pivot
  2. Then it partitions the array into three sections: all of the elements less than the pivot which are located left of the pivot, the pivot itself, and all of the elements greater than the pivot located to the right of the pivot
  3. Lastly it runs steps 1 and 2 on the left and right partitions recursively until the full partition is sorted

I’ve seen university lectures that discuss the Quicksort algorithm for hours, so hitting all of the points in 5 minutes isn’t practical, however all of the items that I’ve discussed should help in a programming interview and in the resource section I’ve included links, including: animations of how Quicksort works, a code implementation that I wrote in Ruby, and some long form videos.


Dead Simple Object Oriented Programming Explanation


No one likes Mondays, so each Monday I like to walk through a complex development topic and give a dead simple explanation of how it works in the real world. So even if your day is rough at least you’ll have learned something new, or at least a new way of thinking about it.

Today I will cover how object oriented programming (also called OOP) works. When I started programming over a decade ago I learned how to build applications procedurally with languages such as C and PHP. If you’re not familiar with procedural code, it simply means that you build the program in sequential order and call methods when you want shared behavior between pages in the application. For example, if I had an invoicing application, I’d have a page for creating a new invoice, another page for showing the invoice, etc. And each page would have scripts that would call methods such as ones connecting it to the database or rendering a date in a specific format.

Now that you have a high level view of how procedural programming works, how does object oriented programming work? I like to think of object oriented programming as a way of modeling a program, where all of the functionality is abstracted so it can be shared throughout the application. Let’s take a look at a real world case study.

Imagine that you’re building an application that allows users to create accounts and you also need to have the ability to make some people administrators. In object oriented programming you’d have a User class, in that class you’d have methods such as:

  • Register
  • Sign in
  • Encrypt password
  • Etc

Now we have the issue that you have two types of users: regular users and site administrators. For the most part both user types are pretty similar, the only differences will be things such as editing pages and admin type tasks. In procedural programming you’d need to create two different types of users which would lead to having quite a bit of duplicate code. However in object oriented programming you can simply create a User class, and then create RegularUser and AdminUser classes that inherit from the parent User class.

When child classes inherit from the parent class they get access to all of the methods and functionality of the parent class, and then you as a developer can give them custom behavior. So for our case study the AdminUser class would contain methods unique to it that the RegularUser class wouldn’t have, which would give it the administrator functionality.

Do you see how that works?

Object oriented programming, at at high level, is all about being able to structure code in a way where functionality can be inherited and behavior modified however the developer sees fit. If done properly object oriented programming can lead to very elegantly written programs that have minimal code duplication.

I hope you have a better idea of how object oriented programming works, obviously this was a high level view of how it operates, in the resource section I’ve placed links where you can take a deep dive and learn more about how it works along with how to build real world object oriented programs.



Freelancer Tips: Three Ways to Get New Clients


On Fridays I cover various tips for freelancers and today I’m going to discuss some strategies that I’ve used successfully over the years for getting new clients.

There have been three main ways that I’ve gotten new clients:

  1. Outsourcing services such as Odesk and Elance (which have now merged to be Upwork)
  2. LinkedIn
  3. Referrals

In future episodes I’ll go into detail on various ways that I’ve had success in each one of those channels so that you can take some of the experiences I’ve had and apply them to your own freelance careers.

freelance servicesFreelancing services such as Upwork are great for finding new clients, the keys to success are to constantly send out proposals, dozens per day and be quick to communicate with potential clients. If you’re a US or UK based developer make sure you understand that you’ll be competing from developers from all over the world which means that the bids that you’ll be competing with could be dramatically lower than what you’d want to charge. However I’ve been able to get dozens of long term clients from these services, including large organizations such as Eventbrite and Quip.

clients from linkedinLinkedIn is an interesting tool for freelancers, I’ve gotten several clients from the service simply by having a filled out profile and joining user groups for the languages and frameworks that I specialize in. I’ve gotten clients such as AppDev and the Flatiron School from LinkedIn. Interestingly enough I was never pro active with reaching out to clients, if you have a good profile showcasing your skills and join enough groups the jobs start to come in. It’s incremental growth, but I’ve found some great clients though LinkedIn.

clients from referralsLastly referrals are one of the best ways to get clients. This marketing channel typically takes the most time depending on your own social and client network. When I say referral I’m not simply referencing referrals from other clients, I’ve gotten referrals from co-workers, friends, family, and through networking events such as local Chambers of Commerce organizations.

I hope this has been a helpful guide to different freelancer strategies for growing your client base, stay tuned for future episodes where I go into detail on how I’ve worked in each channel and built up a large set of customers.

Building Habit Forming Behavior Into Apps


Hi, this is episode 4 of CronDose, I’m your host Jordan Hudgens, I’m a Ruby dev and CTO of DevCamp.com

On Thursdays I cover an item in the news for the tech sector, and specifically discuss how it relates to developers. Today I’m going to discuss the announcement by Facebook’s CEO Mark Zuckerberg told the world,

“Today, people around the world spend on average more than 50 minutes a day using Facebook, Instagram and Messenger…and that doesn’t count WhatsApp.”

Depending on your own usage of this social channels that number may or may not surprise you and it may say something about how the world is transitioning towards a different type of social interactivity. However the topic for this video is how to build that same type of habit forming behavior into your own applications.

Last month I read Charles Duhigg’s book “The Power of Habit: Why We Do What We Do in Life and Business” on habits as they relate to technology where he explains some of the key elements that drive our addiction to applications like Facebook, Instagram and Twitter. Most of the features that get us to stay on these applications so much are focused on the reward and convenience centers of our brains.

Our brains like things that are easy, and checking our what our friends are doing on Instagram doesn’t require much work, and since it’s on our phone it’s pretty convenient to pop the app open a few times an hour to see what everyone is up to. For the reward portion of our brain, even though it may not seem like a big deal, each time we get a new follower or a few more likes on a picture it triggers the reward section of our brains, which functions in many ways like a drug and drives us to want more followers and more likes.

Based on some of this research I wanted to present the following recommendations for building features into your own applications that will help drive habit driven behavior, some features that could be built in would be:

  1. If you are trying to teach users a topic, show them a progress bar and increment it each time they finish a lesson or quiz, them seeing the progress bar slide up closer to 100% will give them a mental reward and make them keep coming back for more.
  2. For a mobile application make sure you take advantage of notifications, most brains have a hard time ignoring notifications on an app, the curiosity makes us want to click on it to see what it says, which will continue to drive users back to the application.
  3. Give rewards for completing tasks, Foursquare, Yelp, and even the Apple Watch’s exercise application give our badges for successfully finishing undertakings, creating awards for streak based behavior, such as exercising for 5 days in a row, are very powerful motivators.

Hopefully those ideas will help give you a start on how to build habit forming behavior into your own applications, good luck with the coding!

Inspirational Programming Quote from The Fountainhead


On Wednesdays on CronDose I cover a random programming topic and today I’m going to discuss one of the quotes that I’ve always turned to for inspiration. It’s from Ayn Rand’s book, The Fountainhead. The main character in the book, Howard Roark, is a skilled architect and typifies the concept of being a true craftsman, in the same way that all of us, as developers, should approach our own projects. This quote discusses how every project is special and deserves a unique implementation, and it goes as follows:

“Rules? Here are my rules: what can be done with one substance must never be done with another. No two materials are alike. No two sites on earth are alike. No two buildings have the same purpose. The purpose, the site, the material determine the shape. Nothing can be reasonable or beautiful unless it’s made by one central idea, and the idea sets every detail. A building is alive, like a man. Its integrity is to follow its own truth, its one single theme, and to serve its own single purpose.” Howard Roark, The Fountainhead

Even though this was written in the early 1900s and was for the architecture industry, Roark’s approach to craftsmanship can be applied just as easily to programming. It can be easy to fall into the trap of staying in a comfort zone and simply duplicating implementation and functionality from project to project, however that can create two problems:

  1. You don’t grow as a developer, the only way to get better is to step out of your comfort zone and build features that you’ve never done before so you can learn new concepts.
  2. Projects suffer, becoming square pegs in round holes. Each application has its own set of unique requirements and therefore should have a custom implementation.

I hope that you found Roark’s wisdom inspirational and that you can apply it to your own development projects.

Programming Interview Question: Differences Between Class and Instance Methods


On Tuesdays at CronDose we talk about coding interview strategies and today we’re going to discuss the difference between class and instance methods.

I’m a Ruby developer and this episode’s answer will be addressed from the Ruby perspective, however it’s a concept that can be important to know in other languages as well, for example Objective C and Java have class and instance method options.

So what do you do when the interviewer asks the difference between class and instance methods?

From a practical perspective a class method can be called by itself, for example, if you had a class that handled sending SMS messages, you could call the class method by itself and simply pass in the values that you want to send in the SMS message.

An instance method is a function that requires an instance of the class to be created. In the SMS example we didn’t need to create an SMS instance, we only cared about the system sending the text message. An example of an instance method would be something like a full name method in a Customer class. If you want to know the full name of a customer you most likely have a customer in mind and Already instanciated the class into an object with a specific Customer selected.

In summary, I typically use instance methods since I’m usually calling methods on objects, class methods are helpful from time to time, but in many cases they can be a sign of poorly constructed code since many class methods could be refactored into modules and out of classes.

Dead Simple Explanation of MapReduce


Today in Manageable Monday we’re going to walk through the MapReduce process and how I could potentially use it for the CronDose website.

For the case study we’re going to imagine that my tutorial suggestion page has millions of content suggestions (not really, but let’s pretend).

It would take too long to look at each suggestion manually, so I’m going to use a mapreduce algorithm to analyze and organize the data.

I’d follow the steps below:

  1. Pass each suggestion to the map method to tokenize (convert each suggestion into an array of words)
  2. This map method will return a series of key/value elements (“algorithms”, suggestion_1, “Ajax”, suggestion_2, etc)
  3. The mapreduce framework would sort the returned values
  4. The reduce method would iterate over each of the values and tally up the popularity of each word.

So a final result could potentially be:

“Algorithms” -> 500 times
“OOP” -> 300
“Pagination” -> 200 times

Deep Dive