A long flight to the ESRI user conference got me thinking about how a large commercial jet has similarities to software development on a large project. I know, what you're thinking, this guy has lost it! Just give me a minute to explain.
Looking at a large jet, I often think that it's a miracle that something so large can even get off the ground. To do so, the aircraft must use a lot of energy and fuel, and it needs a lot of space on the ground to get going. Once up to speed, it can easily take off and gain even more speed in the air. The aircraft I'm on is currently doing 528mph (850km/h) seemingly effortlessly.
This got me thinking a lot about building software. I don't claim to be an expert, but I've worked with several software development teams in the past with varying types of management and end-users.
Often times, when starting a new project, managers and end-users want to start seeing results immediately. Can you imagine a jet trying to pull up and take off when it doesn't have enough speed? It would most likely stall and crash, if it could even get off the ground to begin with. This happens a lot of times in the workplace. Managers see the developers working for a few weeks and want to see X number of features working beautifully. A lot of times, the developers haven't even put a front-end on the project yet, and management doesn't have something "real" to look at.
Often times, pushing for seeing these features in completion means that the development team rushes and cuts corners, not thinking about the big picture. I've seen it numerous times. You get so focused on completing these feature tickets, you end up copying/pasting code from somewhere because it's not been written in a reusable way. Or, you rush through writing new code, not thinking about how it could be used in other features of your app. Doing this adds to your technical debt. Managers see these features being completed, and think that you can maintain this speed of knocking out more and more features. Eventually, you will get to a point where the technical debt is so high, making changes to existing features will be extremely difficult, or even impossible.
Having management that is completely on board with the proper take-off procedures is rare. Good managers will be able to push back to the end-users, because they know in the long run, once this project gets off the ground, it's going to really fly!
If given proper amount of time for the developers and architects to really focus on building a good foundation, adding on the the project in the future will be easy. Good software development starts with a good foundation that is flexible and agile. As developers, we should push back to management to give us enough time to lay out the ground work. If the managers can get on board with this just once, they will see how fast the features will start coming together once the good practices and architecture has been laid out.
Take time to abstract away any areas of volatility; logic you know management is likely to change their mind on in the future. Do you find yourself needing the same functionality again and again? Think about how you can move that functionality to a super class, or a service that can be shared amongst your code. For front-end development, this could mean writing generic directives or components, or just a simple class that holds some common business logic.
I promise you, the next time that you receive a ticket to do something similar to features you have already built, you will be able to complete them in no time. Your project is now at 500mph, and your aircraft is agile and maneuverable. It all comes down to that time you spent preparing for the flight, and smoothly accelerating down the runway.
I do a bit of contract work here and there, but not too often as I work a full-time job. Usually, I find my clients via word of mouth, like a friend knows someone who needs work done on a site or a new site created. Only once did I have someone reach out to me because they found my business card at a coffee shop (they had a design firm and asked for my rates in case they were overloaded with work). I want to talk about a scam someone tried to pull on me.
Because of this, I was already suspicious when I received a text message from a man who calls himself "John Williams".
John: Hello how are you doing today? My name is John Williams i'm making an inquiry to know if you can handle website design for a small scale business and also if you do accept all major credit cards if yes kindly get back to me asap. Thanks....
The initial mention of the credit cards seemed weird, as well as not mentioning how he found me. I decided to go along with it and see what he had to say about the "project". I replied quickly stating I did in fact take credit cards (I do use Square invoices for a regular client who pays with a credit card), and would like to schedule time to chat about the project. It took him a while to reply:
John: Good I have small scale business which i want to turn into large scale business now it located in Alaska and the company is based on importing and exporting of building equipment so i need a best of the best layout design for it. Can you handle that for me?
Okay, so this is starting to seem a bit weird. You don't just turn a small business into a large one by building a website, but maybe English isn't his native language and the translation is just coming over strange. I give him the benefit of a doubt and continue with our conversation.
I tell him that I can definitely handle building the site for him, and would like to schedule a time the next day (it's already evening at this point) so that we can talk about the project and I can explain the process that we would go through. He completely dodges the phone call scheduling again.
John: so i need you to check out this site but i need something more perfect than this if its possible http://conamco.com/ ... the site would only be informational, so i need you to give me an estimate based on the site i gave you to check out, the estimate should include hosting and i want the same page as the site i gave you to check out and i have a private project consultant that will provide the text content and the logos for the site.
Ahh, there it is. The second person. I don't know why, but this is something scammers seem to do, always giving you off to a second person. I am guessing that this is a way to know which people are falling for it, and those people will contact the second person, who will then try to get you to pay them money or give them personal information about yourself.
The next day, I decided to re-initiate contact with "John". I sent him an estimate that I thought would be low enough to keep him interested, just to see where this would go. I told him the estimate would be $800, but I would need a $200 deposit.
He immediately texted back and sent a list of requirements, which all seemed like legit web development requirements. The last bullet point was this:
John: My budget is $4000 to $8000
Considering I quoted way less than that (after all, it would be a very simple HTML website, nothing fancy), he tells me he has this large budget.
After this, I started googling: Web Design Scams. The first two or three hits have the same exact message he sent me the day before, mentioning the small scale business becoming large scale. At this point, I knew 100% it was a scam, and wanted to see what I could get him to do for me.
ME: I thought I would be speaking with your project consultant first? I will need the content and initial payment before I begin work.
John: Okay you can text the project consultant on this *** *** ****
John: Okay get back to me with the total cost
Me: Sounds good! May I ask how you found my web development company?
John: Have you talk with the consultant?
Me: In the last 30 seconds? No. I am curious how you found my business though.
John: Okay someone direct me to you. Mr mike
I do not know a Mike, or not one that I have worked with in many years. I decide to start messing with him.
Me: Oh that's great to hear. How is Mike doing? I know he was pretty upset after losing his children to Ebola last year.
At this point he starts dodging and wanting me to get back to him with the cost (which we've already discussed. I told him I could do it for $4000-$8000, and to say hello to "Mike" for me. Again, he asks for the cost, so I repeat it. Then this:
Me: I need to have proof that your business is real. Can you do that for me?
John: Okay how ?
Me: Can you send me a picture of your business card? I just want to make sure you have the capital for this size of project.
John: Okay but I don't have it with me right now.
I then tell him to send it to me when he has it, so that we can start the project. I didn't want to delay getting his website built!
After a while of waiting, I decided to try to get him to send me something, anything. I never contacted his "consultant". I figure the time I can keep him busy, the less time he has to try to scam other people.
Me: Your consultant has not responded. Are you really John Williams, I'm having doubts. Could you send me a picture of a letter head or something with your name on it and the company name? I just want to make sure I can trust you, John.
Me: Are you there?
At this point, he's not responding. I'm afraid I may have lost him. I miss talking with John, he seemed like a good guy. I decide to contact the "consultant", and see what he has to say. No word.
Hours later, John writes back. He clearly is in a different time zone (probably in Africa somewhere). I thought I had lost him, and missed our conversations. John asks if I have spoken with the "consultant". I tell him that he has not responded yet, and then I immediately get a message from this so-called "consultant".
Consultant: Yes have he explained every thing to you ?
Me: Yes he has. I am just waiting on proof of the business and we can get started on my end. I have two developers ready to go!
Consultant: So what are going to do about the web site ?
Still ignoring the proof of business inquiry. I'm hoping to get a silly hand-written business card from the scammers. I've also asked for a letter head, just to see what they come up with.
Me: I need the content and logo from you and we can build it. What is your name?
This is where it gets interesting. If you've stuck around this long, I'm sure you're wondering what the scam actually is. John tells me he will send me the letter head, and the "Consultant" says that he has not yet been payed by John so he will not give out the content and logo. You can see where this is going. His name is Scott Evans, another generic English name.
John: Yes Thanks for your response, I am okay with the estimate everything sound good and i'm ready to make payment now with my credit card. I understand the content for this site would be needed so work can start asap but I will need a little favor from you
Me: Ok what is it? Can you send me that letterhead and I will help you with your favor
His favor, in short, is that he will give me a credit card to charge him $7200. I will then deduct $3200 as a deposit for the design, and another $200 as a tip (because John is a really nice guy). Then, I am to send the remaining $4000 to Scott Evans. It is probably a stolen credit card, or one in which they will reverse the charge immediately, taking $4000 of your own money.
I asked him to send me a picture of the credit card and the letter head, and I will take care of it on my end. I tell Scott that I am getting the $4000 that he is owed.
Scott: Ok he owed me $4000 balance for the logo and content...so he told you going to send it to me, then i'm going to send you the logo and content so you can start the work as soon as possible
Me: Yes that is correct. I'm just waiting for him to prove that he is who he says he is and I will transfer the funds.
Now John is telling me that he is on a business trip and doesn't have a card or letter head with his info on it for me to see that he is real. But don't worry, Scott has assured me that he is a great guy, and they have met before. I ask Scott for a picture of John, and John to provide something with his name on it. Obviously John and Scott are the same person, or at least sitting next to each other, so I want to see what they will come up with.
John gets back to me after some time with this photo:
I tell him it is a beautiful picture, but could he please send a quick selfie with him holding a piece of paper with his name on it? Just to make sure... He seems confused by this request. Just then, Scott sends me a photo of his buddy John:
Well look at that, it really is John! John insists that it really is him. I tell him that I believe him, but my business partner insists that we have a picture of him holding something with his name on it. After a quick reverse image search, I came across these photos: fake-scam.info.
He refuses to take the selfie. Instead, he pushes the fact that the site should be running by the end of the month. Sure, I can build a $4000 site in two days! But really, if I could do that, I would be quite rich.
He agrees to finally take a selfie but without writing his name after I threaten to leave our business arrangement. And to my surprise, the selfie arrives!
I hope that this post prevents someone else from falling into one of these stupid scams. Unfortunately, they do work, which is why they keep doing them. I told him immediately after this that I knew it was a scam and ceased further communications.
San Antonio has a lack of rock stations to listen to on the radio. The only one that exists in the area is 99.5 KISS. Over the years living here, I have noticed that the same songs are always playing, and always by the same artists. I can't tell you how many times I have heard Metallica's Enter Sandman. The artists and songs they play are not bad, they are just over played.
One weekend in January, I set out to build a small Laravel app to analyze the songs that KISS plays. Luckily, the KISS website has a little widget showing what is currently playing. Inspecting the code on the site revealed that is uses data from a REST API, that is fully open to the public to use, no CORS or anything protecting it.
Building a service to fetch data from this API was super easy to use, and the source code for this project can be found on my GitHub account. Next I wanted to analyze the release dates of the songs that are played on the site, which is where Discogs comes into play. Discogs has an API that can be used to get information on a given song, including the release date. I still have some work to do on analyzing the dates, as some of the dates my app has retrieved show release dates very recent, as some of the songs have been remastered and re-released.
Currently, the KISS Sucks app shows the most recently played songs and the most played artists. I recently posted the site on the 99.5 Kiss Sucks San Antonio Facebook page as a comment to a post and had great feedback from the community. Some feedback gave me ideas on more metrics to show on the page, and I have an idea of making a searchable section where users can see how often a particular song or artist was played over the course of a week, month, quarter, etc.
As for styling, the site was put together in a short period of time, and styling was more of an after thought. I plan to completely redesign the site from the ground up, and possibly pull in posts from the community Facebook page. This project is completely open-source, so if anyone has any ideas or a design they would like to implement, feel free to create a pull request!
Last year, I wrote my first reflections post about how I felt I did in 2016, and what I hoped to accomplish this year. I plan to make this an annual post in which I hope to push myself each year to do better.
This year I changed jobs, and moved into new technology. I went from working in .NET and AngularJS to working in a Laravel shop, but still using AngularJS on the front-end. I had many good reasons for leaving my previous job, which I cannot express in this post. However, learning a new framework and jumping into a Senior level role was daunting. Luckily, there is a great Laravel resource called Laracasts, hosted by Jeffrey Way. Jeffrey is a great teacher, and I really have enjoyed watching his videos. I would not have been able to pick up Laravel and start working at my new position as fast without this online training.
In my spare time, I have been interested in learning WordPress development. My favorite resource I've used this year is Alessandro Castellani's Youtube Channel. If you're interested in learning to develop for WordPress, I highly recommend his channel. I've used the knowledge he has taught to modify the Hestia theme that is currently running on this blog (as a child theme of course!). Learning WordPress alongside learning Laravel has helped grow my PHP skillset.
In last year's post, I talked about my lack of completed personal projects, and reasons why it took me so long to get work done in my spare time. I made a goal for myself to code every day, even if just for a few minutes, on side projects, but did not exactly succeed. I knew coding every day would almost be impossible. Family and down-time is also important, but it was a goal I wanted to strive for. Here is my Github commits for this year:
I am pretty proud of this chart, and it has allowed me to complete two side projects. e-Listings is a Laravel app I originally intended to use as a learning tool to get up to speed when starting my new job. I launched it earlier this year, and wrote a post about how it was a failure in many ways, but also a success.
After feeling happy about completing and launching a side project, I quickly started on my second. KickoffWP will be launching this week, making two projects released this year. KickoffWP is an open-sourced Laravel project that will be free for the community to use. It's a simple tool that I built to speed up the process of writing object-oriented PHP classes for the WordPress customizer. I plan to release a post going into more details on the project soon, as well as a YouTube video.
One thing I have been wanting to do for a long time is to start my own YouTube channel. For Cyber Monday this year, I bought myself a Blue Snowball microphone. I chose it over the Yeti because I read that the Yeti can be very sensitive, and between dogs and street noise, I was afraid it would pick up too much. After setting up my microphone, I started my YouTube channel, and created my first series. The series is building a basic WordPress theme using TailwindCSS.
I plan to grow the channel and incorporate vlogs talking about my experience in code and work, and hopefully help others that are experiencing situations that I have experienced in the past. The first vlog will be released during the first week in January. The current plan is to release atleast one vlog episode per month, and a tutorial video once per week.
Next year, I have plenty of goals and plans for myself. I would really like to grow the YouTube channel and see where that takes me. I've enjoyed the few episodes I have recorded so far. Another goal of mine is to speak at atleast one conference. On January 1, the WordCamp Atlanta opens up for speaker submissions. This will be the first time I submit a talk for a conference, and I am hopeful to get to speak.
That brings up another big life change that will be happening in 2018: my wife and I will be relocating from San Antonio, TX to Atlanta, GA. I am excited to be closer to my family for the first time in six years, and ready for something new. As a remote developer, I will continue to work for Windstream, which will be nice to not have to find another job at the same time as a cross-country move.
As for projects, I would like to launch two more apps. I currently do not have any ideas for my next project, but I am sure I will come up with something fun to build. Marketing is still a mystery, and I am using KickoffWP and e-Listings as learning tools. Maybe next year's review I will talk about traffic growth to these two platforms.
As I talked about in an earlier post, e-Listings is a simple Laravel SaaS (Software as a Service) for Real Estate professionals as well as for sale by owners. I originally started building the app earlier in the year when I had accepted a job offer for a job that was primarily in Laravel. This app was a learning tool for me to learn the ins and outs of the framework, and to build something useful for my mom, who is a real estate agent.
As I worked on the project, I decided to try and monetize and market the app, to see if I could earn a small income on the side. This proved very difficult for many reasons, but I have learned a lot.
I had never used social media outside of my personal Facebook page, or just skimming over posts on Twitter. How do I get noticed? How do I get people to see my posts and get interested in my product?
My first thought was to just pay for it. I ran a few small ad campaigns on Facebook, only to just waste my money. Only a few of the impressions actually ended up having users interact with the ads, and none of them actually went to my landing page (which was set up to take email addresses to let users know when the app was fully launched). I then moved on to Twitter.
Twitter seemed a little easier to get people to follow me. I did some research and started following some tips I found on the internet; I followed real estate professionals, retweeted hot real estate posts, and commented on a few things. Showing interest in real estate got a few followers, but nothing to write home about, but it did give me a small audience to try to pitch my product to.
eListings is currently in BETA, and I decided last night that I would launch this morning. Launching was easy. I use Laravel Forge to publish updates to the production site. Development work is done on a dev branch, and anytime I want to deploy, I just merge it into master, and Forge handles the rest.
If you are not embarrassed by the first version of your product, you’ve launched too late.
Reid Hoffman, Co-Founder LinkedIn
I decided last night that the site worked, all tests were passing, and it did what I set out to do: allow a user to create a website for a real estate listing. There is a lot left to do in terms of design and user experience, as well as more themes for the users. It could take me a while to get everything completely done, and as time goes on, I will start to lose focus and enthusiasm for the project.
Launching now gives me a sense of completion. And, if I continue to market and get a few users, I am sure I will be motivated to continue building the product. If not, then I've lost a small amount of money and time to learn a lot about building an app in Laravel, social media marketing, and a lot of things not to do on my next project.
This weekend I launched the landing page for a new real estate service. The product itself is scheduled to launch in September, but I wanted to post a little bit about it here.
eListings is a simple site that allows real estate agents to create beautiful websites for their listings. There are other services that do this, but the sites are not always responsive, and usually require a lot of information before getting a site up. Not to mention, these services can cost over $25 per month!
I wanted to build something that would take only a couple of minutes for an agent to build a site, and to easily share it with social media. eListings allows a user to enter in basic information about the property, such as address, bedrooms, bathrooms, and a few other fields. Uploading photos is a snap, just drag and drop all of the photos of the property, and the album is created.
If you're an agent and want to receive updates on the product and to know when the site is ready for you to use, head over to eListings and give us your email address.
Now for some techy stuff; I am building the service on Laravel 5.4 and mySQL, and have it hosted on a DigitalOcean server and am utilizing the Laravel Forge service to make my sys admin work easier. The images are being hosted on a Google Cloud server, which is very reasonably priced and easy to use.
We are wrapping up 2016. As it comes to a close, I'd like to take a look back at the year and plan for a new year resolution. On February 28, I started the RewardApp as I am calling it. I still don't have a name for it, and it is still not yet ready for a Beta release. It's not a terribly complicated app, so why has it taken so long to complete?
You can clearly see several places where I went weeks without updating the code. It seems to me that it coordinates well with the deadlines and stress levels I had throughout the year at my full-time job. When I feel stressed, I often times just want to sit down after work and stare at mindless television. So how can I better myself in 2017 to complete these side projects of mine?
I have a resolution this year; every single work day, I plan to work just 15 minutes on something. I'm giving myself the weekends off, unless I am just motivated to get in some extra work. This 15 minutes could be first thing in the morning, during lunch, maybe during a mid-afternoon break. I think just trying to do something, anything, will help. It might not even be coding. This could be as simple as testing the app and logging ideas or bugs into GitHub.
My other resolution this coming year is this site itself. It has always just been a placeholder on the internet with my name and info, and not much more. I've started learning WordPress development, and plan to continue my education. I'm going to start pushing myself to start blogging about the issues that I run into and how I resolve them. I also want to start some coding tutorials on all kinds of things that I like to code. Maybe it will help somebody someday.
I have gone through many iterations of my personal website. I would usually update it once a year, usually in the fall. This year, I decided to do something a bit different...
I have been wanting to learn WordPress development for a long time. I would learn a bit here and there, but it never quite clicked with me. Well, here I am trying to finally get an understanding of it. This theme on my site currently is a child of the Altitude Lite theme. If you'd like to download it, it is available on my GitHub account here.
There aren't a whole lot of differences between this child and the original. I tweaked some styling here and there. But most importantly, I created two custom post types that are used on my Work page. This allows me to quickly add portfolio items, as well as my work history, to the page. This was the first time I worked with short-codes, and it was relatively painless!
I plan to modify this theme farther, and when I am ready, I will re-brand the site with a new theme from scratch! (And of course, it will be open-sourced!)
Copyright © 2018 Chris Perko