Website & Email Migration | Bee Natural

This client came to me with quite a large problem. He had a web developer that no longer wanted to maintain his websites and he needed them moved from the current servers. These sites also had 4 email accounts that needed to be moved as well.

The site migrations were easy enough with only a couple minor surprises, like the fact the sites hadn’t been maintained for a long time.

The email migration proved more challenging. After some trial and error with the first account, we were able to get the other three migrated without a problem.

We were able to make the transition without any loss of data or downtime, but migration is always time consuming. This is why hosting providers make the initial cost so low, because they know that the switching cost is very high.

The big take away here is that you should spend a little bit more up front to have a solid web strategy, rather then always slapping things together till they work.

Dang it Jim. You’re a CEO, Not a Web Developer!

If you’re a Star Trek fan, you already know where this is going.

“I’m a doctor, not an engineer!” screamed Dr. Leonard McCoy in the original series of Star Trek.

That iconic phrase spawned many repeats and for good reason. It is the expression of being called to do something that is outside of your expertise to the extent that you’re surprised if any solution actually accomplishes a fraction of its intended purpose.

This “I’m a doctor, not a…” blank meme resonates with almost everyone.

Within this mindset I write this article; to help anyone who’s ever felt to say, “Dang it Jim. I’m a CEO, not a web developer!”

When I said this phrase myself before I became a web developer, it was more like, “Dang it Jeff, I’m an entrepreneur, not a software engineer!”

I was a year into my post-undergrad job and I started working nights and weekends on an idea to change the way we buy products. I needed technical help and was enchanted by the notion of getting it for a fraction of the cost overseas. Jeff, the account manager for the outsourcing firm (who’s name has been changed for privacy), sent me a solution that was twice as expensive as budgeted and a fourth of the quality I expected; but, it performed, and looking back, that is all I could expect when operating so far outside of my expertise.

I’ve spent the last several years building Buink to help people like me. As I think about Buink’s happiest clients, they’re the Entrepreneur/CEO/Founder/Business Person/Marketer that can’t afford a project failure by working too far outside of their expertise.

In other words, our goal is to help you avoid screaming “Dang it!” in the following ways.

Lower Risk

I heard these exact words from a client last month, “I wish we had found you before we spent 100 thousand dollars on other developers.”

The amount of money that is wasted on poor quality, buggy, ineffective code is staggering. If you’re not careful, you can blow 10 grand in a blink and have almost nothing to show for it.

Over the past 3 years, we’ve built processes and paradigms that ensure you’ll get value from every dollar you spend on development. In fact, we stand behind our code in the form of discounts if we fail to deliver the value our clients have come to expect.

Better Solutions

We base our solutions on tried and true principles of web development. We’ve written articles on these principles in the past, but some examples include code duplication is bad, simple is better, foundation is important, servers are cheaper then humans, etc.

These principles help us find more intelligent solutions.

One recent example of this was when our client wanted to roll out an IOS app. As we built out the plan, we had the familiar uneasy feeling of violating the code duplication principle when trying to keep everything in sync across the web and IOS.

On other projects, we had used a cross-platform technology that allowed teams to maintain one front-end code base and use it across the web, IOS, and Android. Only recently, these technologies passed the usage threshold proving they’re robust enough for consideration, the problem is that you can’t add them to existing projects easily.

Wouldn’t it be great if we could find some open source software to take our current front-end and build it for IOS? This would not only help us avoid code duplication but also drastically reduce the cost of the new app.

Our search began and ended surprisingly quickly. We found a fledgling open source project that was coincidentally maintained by the makers of the cross-platform technology mentioned previously.

Despite its newness, the software paid off handsomely for our client. We ended up being able to add this technology to our codebase, spin up an IOS app, and access native functionality like in-app purchases as well as password storage via IOS keychain.

This big win was only made possible by our principle based approach.

Pre-written Code

A good portion of the online asset you want to build has probably been built before. Things like user authentication, database connections, routing, and templating are used almost ubiquitously across the web and should not need to be re-invented for every project.

So, to lower your overall cost, we leverage as many open source technologies as we can. They lower the learning curve for adding new developers to a project. They make it easier for us to communicate standards for writing new code. They also provide a solid foundation that we use to add your custom business logic.

We’re very proud of the technologies we recommend, you can see most of them on our services page.

In addition to those technologies, we also have proprietary boilerplate code that we use to further lower the cost of your project. We’ve found that these open source technologies can be improved by adding another layer of code to make them work in tandem better and for other common requirements.

These boilerplate helpers are built on top of existing open source projects and are written with the highest standards. Similar to the open source technologies, they also reduce the time it takes to start writing your custom logic. In addition, they’re included free of charge when starting a new project with us.

No Black Box

I am a strong believer in transparency. You’ll find this belief sprinkled through our guiding principles, our operations, our contracts, etc.

When working with us, you have access to the code, the communication systems, the project management system, everything. You can contact our developers directly and immediately if needed.

From the very beginning of Buink, I’ve been trying to open the web development box and shed some light on how things work. I’ve written articles on what a website costs, ways to lower that cost, how to make offshoring work, why our contacts are the way they are, and some common ways that projects go wrong.

Even if you’ve been part of a development project in the past, these articles can help you asses whether your values align with ours and help you understand how we operate. My main goal is to avoid unhappy customers who learn these things part way through their first project.

Truth is, however, no matter how much you read, you’re likely still operating outside of your expertise and you could benefit from an expert like us on your team.

Business Mindset

We speak your language. We look at everything from a business perspective. You’ll get a good sense of why we do that in our article about striving to be code butlers.

Let me share an example of this. I have an ongoing client who had it written in our original contract that I was not to contact her directly but to work with and report directly to her lead developer.

I thought that was a bit strange, but I figured she’d probably had developers in the past who asked pointless questions and/or didn’t respect her time and needs.

Fast-forward two year, we’ve helped her build out a system to automate her quickly-growing business. She and I also have a bi-weekly meeting and her’s is one of our longest ongoing projects.

I attribute her change in behavior to our ability to understand her business needs and how she needs us to work with her.

Control Your Spend

On a typical project with us, all change requests are approved by you before they’re started, they’re approved again by you once you see them in a testing environment, and finally they’re approved again once released to a production environment.

There is no black box. With every deliverable review, we note the total time billed for any given task. We also send you detailed weekly reports with quick-to-skim summaries so you know exactly how your money is spent down to the second of billable time.

Solid Code

In addition to your review, all code changes are reviewed by a lead developer to ensure code quality and value. We’re checking for adherence to our guiding principles and other industry best practices. We’re also looking for security flaws and potential bugs.

The result of our review processes are more solid, less buggy, more valuable code.

Better Designs

We’ve worked with many great designers over the years and we’ve still never met one whose designs can’t be improved by doing technical reviews during the design phase.

We do offer design as a service, but if you already have a favorite designer, you can still involve us in your project to offer technical direction and feedback.

Diversify Your Team

Which team is more likely to succeed: two in-house developers or one in-house developer and one outside developer consultant?

You can probably guess we’d propose the latter.

In-house developers are awesome if you have enough work to support them. They’re sometimes more affordable then contractors (although not by as much as you might think). You have more control over them (in case you’d like to flex your tyrannical muscles). And let’s face it, hiring “in-house” has been the status quo for years (if you care about that kind of thing).

You probably sensed some sarcasm, but in-house developers have some challenges of which you may not be aware:

  • They’re often pigeonholed into outdated technologies for years so their experience may not be equal to that of a contractor with the same years but who is constantly working on more modern technologies.
  • They often move slower then contractors preferring to be comfortable rather then challenged, flexible, and value focused.
  • They sometimes write code in a way that makes them indispensable rather then writing in a way that anyone can pickup where they left off.

Please excuse the general stereotypes, my main point is that hiring “only in-house” isn’t the only strategy and likely isn’t the best strategy. Don’t put all your eggs in one basket when it comes to building your team.

We do understand that bringing developers in-house can reduce the sticker shock of building a website. If you have enough work to support multiple ongoing developers then bringing someone in-house may be smart.

We’d still offer our services as a member of the team or to setup the project, setup the architecture, review code, or manage the project.

User Flow & Wireframes | Guardian

We started working with a small team on a project to disrupt their industry with a web application that was more user friendly than anything available.

We started where any wise team starts, focused on the user. We created a user flow, which is like a plan for how we think the user is going to want to flow through the application.

We also started on the wireframes, but our project came to an abrupt halt when their current sass application announced a re-design to make their app more user friendly.

This paused our project for obvious reasons.

IOS App | Defend Your Money

This project was very fun and also very valuable for my client.

We’d already built a web application and our client asked how hard it would be to create the same application on IOS. The answer is unfortunately harder then you’d think.

That said, we’d used some cross-platform technologies in the past like Ionic, but those projects typically started as IOS apps and the use case was generally to maintain one codebase across Android and IOS, not typically including the web as well.

We dug into our principle of reducing the amount of redundant code and went on a search for some open source software that could help us maintain one codebase across multiple different platforms (IOS, Android, AND the web).

We found Capacitor, but it was just in beta. We talked with the client about the tradeoffs and risk and luckily they decided to take a leap of faith.

We were able to build their existing Vue app as an IOS app and were even able to leverage Touch ID login and Apple payments for the subscription management.

In this end, this was a very fun project and was very valuable for the client.

Docker Environment | Monigle

Although this project changed mid stream, we were able to build Dockerfiles and a container structure that allowed us to spin up a local development environment in a matter of minutes.

One highlight from this project is we were able to use git submodules to combine several different repositories into one working codebase that allowed us to make edits to both the front-end and back-end of the project all within the same folder and see the full stack with feature changes running locally.

Website Maintenance | Web Application | Best-line

We continue to maintain and update Best-line’s application, which increases their productivity and quality.

One highlight of this project is the ease at which we’re able to add large structural changes to the data thanks to Laravel’s database migration and CLI functionality.

For example, we recently did a major overhaul to how the system manages their fabric inventory to drastically reduce the time it takes management to report on inventory and increase the accuracy of inventory reports.

The RemoteFlow Branching Model: A Guide to Continuous Deployment for Remote Teams

In the evolving world of software development, maintaining code quality and ensuring seamless deployments are paramount. The RemoteFlow Branching Model offers a solution tailored for remote teams. Dive in to understand its mechanics and benefits.

We’ve used multiple other branching models with some success, including the Gitflow branching model but there is a better way for remote teams who want to deploy continuously. We call this the Remote Integration Branching Model or RemoteFlow for short.

If your release has ever been delayed because the master or release branch had broken code, then you’re going to want to keep reading. If you’ve ever been blocked from deploying by broken dependencies, you’re going to love RemoteFlow. Or if you’ve ever found yourself in rebasing hell trying to back out changes merged but no longer needed, you’re about to be set free.

In its simplest form, we branch features off master, integrate and test them on develop, and then merges them back into master. Below we’ve included some important rules and tips, but don’t let that fool you into thinking this is complicated.

Benefits of the continuous deployment branching model:

  • Allow all features from multiple team members to work their way to production simultaneously and continuously as they’re completed
  • Minimize the possibility of a feature becoming a blocker for other team members, features, or releases
  • Prevent unproven code from ever accidentally or maliciously getting to the production server and from being unknowingly propagated to other features
  • Allow multiple features to be tested on a QA server (or staging server) at the same time while allowing for any changes found to be corrupt to be wiped from all environments quickly
  • Give team leaders more visibility and control over how and when changes move to production
  • Improve the clarity of merge conflict resolutions and decrease the likelihood of code loss
  • Make it easier to start, stop, and re-start new features.

Two Deadly Serious Rules

Ok, they’re not deadly except to team mojo, but here are two rules that you should never forget:

  1. Never merge the develop, qa, or staging branch into any other branch, these branches are always assumed to be corrupt because they’re used to test all features that can become corrupt.
  2. Always branch new features off the master branch (e.g. git checkout -b INSERT_FEATURE_BRANCH_NAME) and keep them up to date by merging in master often.

Prerequisites

  1. Make sure you have Git installed on your terminal.
  2. Clone your code locally (e.g. git clone [email protected]:vuejs/vue.git .).
  3. Start with a master branch and create a develop branch off master.
  4. Create a feature branch off master and start coding.

Branching Summary

Let’s dig into a little more complete summary of the model. First, branch your feature off of master, make your code changes on your feature branch, and then create a pull request into develop. Now you’re ready to send a pull request to your lead developer for a code and user review. Once the quality of your feature is assured, we merge it with master and deploy it to the production server. Notice we do quality assurance before you merge it to master, this is key.

The develop branch is used to test changes on a QA server and can be corrupted and/or thrown away at any time (hence one of the deadly rules above).

You may be thinking this model will increase merge conflict problems but the exact opposite is true, it just changes the timing of resolving conflicts and gives you more control. We’ll talk about this more below, but the main thing to remember is that you’re conflicting with another feature branch, not develop.

Branching Steps

At this point, you could probably figure the rest out on your own, but we’re going to list out our full internal process because it it is filled with tips and tricks to help you manage the code of an entire remote team easily and effectively.

Let’s imagine you’ve been assigned issue #999, a bug squashing change requested by a stakeholder.

  1. You’ll need a new branch to keep all your changes together, we call this a feature branch.
  2. Always branch features off the master branch (e.g. git checkout master; git checkout -b 999-bug-squish;).
    • Note the issue number prefix (e.g. 999) on the branch name helps connects your feature branch to the change request.
    • In a perfect world, each issue should have only one branch to make it easy to move your changes through testing to production. We note this branch name at the issue link so it doesn’t get lost.
  3. Make your changes on your feature branch and commit them.
    • Pro tip: draw a clear connection between your changes and the issue that requested them by including the issue number in the commit message (e.g. git commit -m '#999 squashed some bugs'). Your team will love you for this.
    • Pro tip: before committing, run git diff to make sure you’re not committing unnecessary changes.
  4. Merge master back into your feature often to make sure it is up-to-date (e.g. git checkout 999-bug-squish; git pull origin master;).
  5. Push your changes back to the origin (e.g. git push origin 999-bug-squish).
  6. Create a pull request (PR) into develop
    • Remember, only proven code makes it to master and it must be proven on develop. We call this the integration branch and it can easily become corrupted by a developer mistake.
    • Pro tip: if your changes affect what the user sees (i.e. the view), include a GIF of the new view to make it easier for the reviewer to review. We recommend attaching the GIF to the PR because that is where questions will arise.
  7. If your pull request has a conflict, don’t break one of the deadly rules…
    • Remember, your conflict is not with develop, but with another feature merged into develop ahead of yours. The following diagram may be helpful you visualize how to resolve conflicts.
    • Pro tip: first, try merging in the latest from master. The conflicting feature may already be merged into master and syncing your branch could save you a lot of time.
    • If merging in master doesn’t help…
      • Find the third party branch that conflicts with yours and reach out to your lead developer to make a decision whether you should make your code dependent on that branch.
      • Pro tip: find the conflicting branch by using the Blame/Annotate feature of Github/Bitbucket. This is where good commit messages from step #3 can come in handy.
      • Pro tip: if you do make your branch dependent on another feature branch by merging it into yours, note this dependency on the original issue link for #999.
    • IMPORTANT: the most common mistake when resolving a merge conflict is to delete another developer’s code. You need to be thoughtful about why the conflicting changes were made and double check with the other developer before deleting anything.
  8. One last thing before you submit your pull request for review, do a mock review yourself.
    • Both Github & Bitbucket provide the ability to review and comment on your pull requests. Make sure all your changes are needed and wanted, use comments to explain unusual looking code, make any last minute re-factoring.
  9. Submit for review by comment on the original issue #999 and include a link to the pull request
    • Pro tip: if the changes require special “steps to go live” or counter intuitive “steps to test”, make sure to include those as well when you submit for review.
  10. Your feature branch’s code changes are then reviewed, merged into develop, and deployed to the QA server for further testing by the customer.
  11. Once approved to production, your branch is merged into master and deployed to the production server.
    • This is why you should note your branch name on the issue link, so code changes don’t get missed.
  12. Whenever master changes, you’ll need to merge it back into develop to keep develop up-to-date
    • If master ever has a conflict with develop delete the develop branch and create it again as a copy of master

Ready to revolutionize your team’s deployment process? Dive into the RemoteFlow Branching Model and experience seamless integration tailored for remote teams. If you’re unsure where to start or need guidance, we’re here to help! Let us assist you in implementing this model with your team, ensuring a smooth transition and continuous deployment success. Reach out to us and let’s elevate your software deployment game together!

If you have any additional questions, please comment below.

Related articles

Glossary

  • Git:
    • A distributed version control system commonly used in software development.
  • Repository (Repo):
    • A location where all the files for a particular project are stored, usually abbreviated to “repo”.
  • Commit:
    • The action of saving changes to the local repository.
  • Merge:
    • The action of integrating changes from one branch into another.
  • QA (Quality Assurance):
    • The process of ensuring that the software meets specified requirements and is free of defects.
  • QA Server:
    • Our definition of a QA server is a server that deploys the develop branch with seed data that can be refreshed whenever needed. This is in contrast to a staging server, which we define as a server that deploys the develop branch but uses a copy of the production data.
  • Staging Server:
    • An environment used for testing the latest version of the codebase before it’s moved to production. In contrast to the QA server, this server does not use the seeded test data, but a copy of the production data.
  • Production Server:
    • The live environment where the software runs and is accessible to end-users.
  • Rebase:
    • A Git operation that allows developers to integrate changes from one branch into another, changing the base of a branch.
  • Clone:
    • The action of copying a repository from one location to another, usually from a remote server to a local machine.
  • Master Branch:
    • The main branch in a Git repository, usually representing the production-ready state of the code.
  • Develop Branch:
    • A branch where new features and other code changes are merged before they are added to the master branch.
  • Feature Branch:
    • A branch created specifically for developing a particular feature or fixing a specific bug.
  • Pull Request (PR):
    • Most git base repositor services (Bitbucket, Github, etc.) allow you to request that a branch be merged into another branch. This request is called a pull request. These requests typically include a list of commit messages that have happened on the branch since it had a common ancestry with the target branch. Pull requests also typically include a full list of code changes. They can also include comments and attachments (depending on the repository).
  • Merge Conflict:
    • If you change the same line of code in two separate branches and then try to merge them back into each other, git doesn’t like to assume it knows which of the two lines are more important. So, it flags the merge request as a conflict and provides comparative information that can be reviewed by the developer to determine what the conflicting lines should look like after the merge.

Explainer Video | Defend Your Money

Our client needed a video and we reached out to our network to get it done. We had to write a script, create the story board, engage a voice actor, and finish up the final animations.

The final cost was very reasonable and the final product wasn’t half bad either.

See for yourself: https://www.youtube.com/watch?v=rUBkUuJ2iKg