Tuesday, September 24, 2019

Internships - Be There for Students!


I had an interesting conversation with my youngest son yesterday as he begins his search to obtain an internship next summer. He told me that last year as a freshman that he had gone to several on-campus events with employers to talk about internships. He recognized as a freshman he probably wouldn’t qualify, but wanted to establish connections with potential companies and learn what he needed to do to prepare for internships. He approached each companies recruiting team with the same story – talking about how many computer classes he had taken in high school, what types of apps he had already created in and out of class, how he had already taught himself the basics of machine learning and the programs he had created utilizing machine learning. At the end of each conversation he asked a simple question – what else could he do to be attractive candidate to be offered an opportunity to intern with the company in question.

The response he got from most companies that were attending the job fairs was what floored me, “If you had other internship positions prior to applying with us, that would make you stand out.”

Huh, what?

 Let’s discuss what the purpose of an internship program is as defined by the Oxford dictionary:


  • The position of a student or trainee who works in an organization, sometimes without pay, in order to gain work experience or satisfy requirements for a qualification
Nobody, and I mean nobody, should be telling a student that to stand out to get an internship that they need to already have had an internship position. I continue to be amazed at the false barriers we place in front of students before we give them a chance in the business workplace. Specifically, as it relates to my particular profession – software development – there is a shortage of skilled workers that is only getting worse as the baby boomers begin to retire. We need to be encouraging students to get into this profession and knock down the mindset that creates statements like the above about needing prior internship experience or that they need a four year degree.

I tell students that I meet with that our internship program is to align with what they are learning in the classroom. To give them practical hands on experience with concepts that they are learning and to expose them to what being a developer means so that they are prepared when they enter the job market as a graduate. Here’s where they will learn things that they don’t tell you in school (list below is not meant to be an exhaustive list of what they will do):
  • Design Documentation
  • Tagging and Merging Code
  • Unit and Integration Testing
  • Implementation Planning and Execution
  • Implementation Validation
  • Defect Management


I’m happy my son has chosen to obtain a four year degree because of the specific type of software development job that he wants to get when he graduates. But, I’m all for students getting the necessary experience in high school and then entering the workforce as an entry level programmer. Alternately, there are great 2 year programs offering Associate Degrees thru our Community Colleges that get students work ready to enter the job market and be great developers.

I have offered internships to high school, community college and traditional four year college students. They, for the most part, have all been able to join my teams and be effective developers.

Don’t ask students to already have completed internships, ask them about what drives them, what have they already done, what are they doing outside of the classroom that proves that they have the passion to develop great software? What experiences have they had working on a team project – either in school or with friends? What experience do they have in resolving conflicts within a team project? What kind of a student have they been – where have they gone above and beyond what was expected in assignments? What type of relationships do they have with their professors?

Stop finding a way to say no and find a way to give hungry students opportunities.

If you'd like more information on my background: LinkedIn Profile

Tuesday, September 17, 2019

It's Time To Revamp K-12 Programs for the 21st Century


My kids have worked their way thru K-12 and are in the midst of their college experience. I’ve now seen what our modern education system is like. And, to be honest, I’m not thrilled with the current opportunities and expectations that are set on our K-12 students. Our system is not preparing students for todays workforce, let alone for tomorrows workforce.

What do I mean by this? Well, our education system is still largely based on standards set in the last century. We are not providing the necessary exposure to the jobs of today, limiting the ability of high school students to graduate with the ability to get entry level jobs in software development, networking or cyber security. Yes, I’m focused on a specific set of technology jobs, but I passionately feel that these are jobs where students could enter the work force immediately graduating high school, if given the appropriate training along with internships/apprenticeships while in high school

To be quite honest, I’ve provided jobs to selected high school students who have done the necessary work thru AP courses in high school along with taking selected courses at our local community college.

What I find frustrating, is that there are no standards that high schools create a path for these types of careers. Yet, we still force kids to take 3-4 years of foreign language coursework. I have talked to my kids and many of their friends – all of whom either took 3 or 4 years of Spanish. Our school district is rated within the Top 10 in the state of Iowa, so, they have great educational program opportunities for students. With that said, my kids, and their friends will all freely admit that they can’t speak conversational Spanish after their 3-4 years of coursework. Yet, they were all forced to take a foreign language due to the entrance requirements of colleges.

We provide students with opportunities in shop – metal and woodworking, automotive, and other trade programs. These programs are valuable and allow students to get the training needed so that they can potentially get jobs after graduating high school. Computer Science jobs are in demand and there is no reason why students graduating from high school can’t fill these well paying jobs if they could just get the necessary education.

Standards need to be set at either the national or state level that force local school districts to revamp their courses to provide educational and training opportunities for students to land entry level jobs in software development and networking. I’d also take a run at saying cyber-security based on what I’ve seen some high school kids achieve when given the right resources. This isn’t an either-or conversation, we must provide a path for students interested in pursuing these careers that doesn’t involve post high school education.

With today’s technology, there is no reason we can’t provide remote/virtual classrooms with the instructors from our local community colleges. They have the programs in place, are knowledgeable in what they do and our community colleges can provide this while the local school districts either work to get their own programs in place or make the decision to permanently rely on the community colleges to provide these services.

These are good paying jobs and would allow students to graduate from high school and enter the workforce without incurring debt associated with getting a 2 or 4 year degree – four year private colleges can easily exceed $160k. Granted, almost nobody pays the full tuition burden due to financial aid, but many still graduate with $100k in debt.

Some students will still want to continue on to get either a 2 year or 4 year degree. Bravo! We need these students as well. If they want to take additional course work, they will still find jobs when they complete their education. There is nothing wrong with that route and we should encourage those who can make the investment to do so if it is what they want.

I hear some make arguments that their after-school clubs and programs like Lego Robotics are available for students that are interested. Come on! Yes, these are nice, but there are many students who are not able to attend after school programs, and whose families don’t have the financial means to support some of these programs that cost additional money. Also, these are not consistent across all middle schools and high schools. It is critical that every school district provide educational opportunities in software development and networking – it is the 21st century and our students deserve to graduate with skills that allow them to enter the workforce.

Not every student is going to want to go thru this type of a program. And, they shouldn’t. But we should be presenting these types of programs as acceptable options for students that are interested.

If you'd like more information on my background: LinkedIn Profile

Tuesday, July 30, 2019

Blow Up Your Meetings - Keep Your Do-It Crowd Focused on Delivering

Most programmers I know dread meetings. Meetings are the bane of their existence. They interrupt their creative juices – for what they perceive as no value. You can easily extend this to other knowledge workers that are part of ‘do it’ team that are involved in the design, build, test and implementation of apps into your organization – either for internal or external use. I’m talking about the group that spends their entire day in the ‘do it’ mode. This is not the occasional floater that briefly touches the effort and is then gone. 

I’ll go a step further and state that most people inside of organizations hate meetings – they’re usually run poorly and don’t provide meaningful outcomes. Then, creating the need for additional meetings.

I’ve made the transition to management and my day is filled with meetings – that’s my role and I’m used to it. There are days where I think about just spending my time coding, but, professionally, those days are now in my past. Some of these meetings are tactically driven to look at individual efforts underway and to remove roadblocks, others are more long term or strategic in nature. Those of us in Project Management or Management sometimes forget that we hired these folks to be the builders and that’s where they should be focusing their time. While we need to minimize time that these people spend in meetings, it is still a critical part of their job that hopefully gives them a richer understanding of what it is they are brewing up.

Let’s look at what makes the ‘do-it’ crowd productive:


  • Being a part of a team – the culture!
  • Understanding that what they do makes a difference.
  • Long periods of uninterrupted time where they can focus on solutions.
  • Ad-hoc collaboration to solve specific issues – note the word ‘ad-hoc’.
  • Ability to learn – technology and the business.
  • A manager that keeps the ‘bureaucracy’ away from them.
  • Spending an hour or more in a room to get the current status.
  • People in the process who are supposed to be decision makers who fail to make decisions.
  • Meetings that rehash information that is already known or decisions already made.
  • Leaders of meetings that do not have any focus – meetings with no Agenda, leaders that ignore the Agenda
  • Leaders that don’t encourage everyone to give their opinion or to be heard
  • Attendees that do not add value to the meeting and divert the discussion or are not engaged


Now, let’s think about the things that your ‘do-it’ crowd finds disturbing:
There are a lot of reasons to hate meetings. Unless run correctly, they burn thru real dollars by diverting your talented team members away from the very jobs you hired them to do in the first place. So what’s a Manager or Project Manager supposed to do?

First, blow up your meetings. Ask yourself if a meeting is necessary or if a short one on one conversation with the appropriate decision make would be more effective – you can share decisions with the team without taking them away from their work. Personal conversations provide significantly more value in solving a problem vs getting 20 people in room to try and reach a consensus. Who really owns the decision? Maybe you need to pre-meet with folks ahead of time to collect ‘intelligence’ to share with the decision maker. Provide them with the information you’ve collected and get a commitment from them to get a decision if they aren’t able to make a decision in your conversation.

If a meeting is truly necessary – think about the following:

  1. Replace your status meetings with stand-up meetings. Include only the actual team members and limit the discussion points to what is being worked on and what assistance is needed to remove roadblocks. The Project Manager then has the responsibility to communicate the status outside of the team. The teams focus should be on sharing with each other and helping each other solve problems. No team member should need more than a couple of minutes and then your ‘do-it’ crowd can get right back to work. And, stand up, literally means stand up. Do it in where your developers are sitting, pull them to a corner of the room.
  2. Blow up your meeting – I know I already said this, but blow up your meeting! First, be stingy on who is allowed to attend your meeting. Ask yourself what value each individual can bring to the meeting and what issues they can help solve. If they have no skin in the came and are not accountable or responsible for delivery of the decision, than boot them out. Next clearly define the purpose of the meeting, what decision points you are looking to lock in during the meeting. Share your agenda ahead of the meeting along with the background of what is going to be discussed – each item should have a summary that the attendee can review that identifies the issue, what has already been tried, what recommendations are on the table and the pros/cons of each recommendation. Once you know your decision/discussion points, time box each item and include the discussion time in each agenda item. When the meeting occurs, don’t rehash the discussion points and potential solutions, but use the time to get to a drive to a decision. As a leader of the discussion, make sure everyone in the room contributes to the discussion.
  3. Bonus points – don’t meet unless you’ve pre-worked the meeting. Take a walk around the building and solicit input from the stakeholders in the meeting. If the folks you need to talk to aren’t in the same building – use video conferencing (preferred so that you can pick up the non-verbal signals) or use the phone. Please, please, do not do this via email or via text chats.

Your job as a Manager or a Project Manager is to enable people to delight your customers. If your organization is needlessly dragging people away from the jobs they were hired to do, you are failing them. You are impacting their ability to successfully achieve the results you hired them to deliver to the organization. You are failing your customers by delaying meaningful changes that allow them to use your products and services.

How are you helping your teams succeed?

If you'd like more information on my background: LinkedIn Profile

Tuesday, July 9, 2019

Your First Job ... Software Development!

So you got that job you wanted! You’ve been invited to join a team developing software … this is the moment you’ve been waiting for, it’s time to make a difference. So what’s your first move?

When you’ve landed that first job as a software developer, it’s important to create the foundation that will enable you to build long term value to the organization and team that you just joined. And, ultimately, to add value to the customers that will use your code – both internal and external. Yes, you were hired to come in and ‘create’, but that is not the only role you are expected to play and it is important that you develop the underlying skills and habits that build value within the team. Ultimately, setting up the conditions that will allow you to excel and become an important member of the overall team.

Below, are some things that you, as a developer, should think about and create action plans to help you settle in and create that foundation for longer term success:


  1. Continue Your Education: You need to realize that your education never stops. You may have finished a phase of your education – high school, community college or a four year degree – but that is literally just the starting point. There is no way that the languages that you have learned to this point will be the languages in use by the time you end your career. If all else fails, you will be introduced to new frameworks, development paradigms and development tools. If you are to build value as a developer, you need to identify how you will continue to learn and how you will be seen as a positive agent of change. Don’t wait for the team that just hired you to invest in your skillset and overall professional knowledge. You will need to find ways to keep abreast of the changing technology, development paradigms, tools and frameworks. This will make you more valuable to the team and open up possibilities to play other, more expansive roles in your future. Some of this, you can do on the job, but if you really want to excel as a team member, you’ll find time outside your normal workday to continue to expand your knowledge.
  2. Establishing a Mentor Relationship: If your boss has not assigned you a mentor, ask for mentor. This is important for multiple reasons. First, you want access to a resource that help you become familiar with the teams choices for tools, frameworks and other technology. Additionally, this person should help you navigate the expectations, rules and norms of the team. Last but not least, the mentor will also be available to assist you in how the company operates – what happens outside of the team that you need to be aware of and how to interact with other parts of the organization, learning the soft skills that will help you navigate your career.
  3. Understanding the Technology Stack/Tools: Back to learning! Yes, one of your first tasks as a team member is to learn the stack that your team uses to build apps, the frameworks that they have in place to accelerate the development process and the tools that they use to plan, build, test and implement the code you build. This covers everything from the editor to understanding the layout of the development environment, what authorities you need to establish to access the environments and to build your apps and your test and build tools. And, yes, as a developer, you’ll be expected to do more than just write code. Use your mentor and team members to understand the overall stack used to build apps by the team, the apps that are typically supported by the team, the integration points between the apps you’ll be working on and other applications and interfaces that the organization supports.
  4. Ask For Help: You are going to be overwhelmed! You need to stop telling yourself you’ve got this and ask questions to quickly close the knowledge gap between yourself and your teammates. Everything from what the accepted behavior is within the team – do people want unscheduled interruptions, do they prefer you schedule time with them to discuss roadblocks, how do you use the communication tools and what’s the norm – IM vs Slack vs MS Team vs eMails vs FaceToFace vs Video Conferencing, what are the standards the team follows MVC vs MVVM, syntax formatting standards, variable/object naming conventions. Right now, you are not the smartest cat in the room. Even if you scored perfect ACTs and had a 4.0 thru your collegiate career, your teammates have real world experience developing code and using the tools/frameworks and internal corporate processes that you simply have no experience with. Be humble and recognize what you can learn from others.
  5. Be Humble: Your excited, you want to contribute, you want to show your teammates that you add value. Do yourself a favor – listen, listen some more and when you feel you’re ready to speak, listen some more. Your job is to learn from the folks who’ve already cut their teeth and know the ins and outs of the applications your working on as well as the expectations of the customers and the organization. Coming in with little or no practical experience and beginning to act as if you have the solution to every problem the team is having is a fast way to alienate the very people that you need to be successful. Listen to what they have to say, ask questions, understand why they want to do things certain ways and what the history is behind decisions. After you’ve spent plenty of time understanding, then contribute your solutions being mindful of the history of how the team got to where they’re at today.


And here are the more technical issues you’ll need to think thru to establish yourself as a net contributor within the team and to make that foundation your building a rock:


  1. Security Is A Requirement: The days of being able to push out applications, api’s and frameworks without security consideration are over. Security needs to be a central consideration in the changes you are making, how you test those changes, how you implement those changes and how you support the changes in your production environment. The days where a ‘hole’ could be tolerated because nobody would really attack your organization are long gone. Highly skilled teams are actively scanning the internet and are using social engineering techniques in an attempt to infiltrate your organization and either hold it ransom or to steal the data so that they can use it to make money. Developers need to be aware of the role they plan in creating hardened applications and production environments that allow your customers to do business with you, but that put barriers in place that make it difficult for bad actors to wiggle their way past the front door. This not only includes changes in how you develop code, but ensuring you act as a good citizen by not opening emails or clicking on web site links that could be used to deliver ‘unwanted trojans’ into your environment.
  2. Your Code is Bigger Than You: These days it is rare that an application can be written that is completely stand-alone. Most applications created today are expected to interact with other internal and external applications, data repositories used for ‘big data’ analysis or artificial intelligence models. You may be tasked with working on a single function, but  you need to be inquisitive and understand how your piece works with the greater whole – within the overall application being touched – or thru feeds to other systems, api’s that utilize the data you capture and any other way that your app/data could be used. Start learning the complete data flow of the application and the data used/touched by the application.
  3. Code Reuse Is Encouraged: How things have changed! When I first started programming – yes I used a chisel and a stone – the internet did not exist. In other words, if you were creating something new, you were by and large pounding out all of that code. Sometimes you got lucky and you could reuse chunks of code that other developers had, but that was uncommon as code wasn’t really modular and you had to use sneaker net. Today, developers can hit GitHub, StackOverflow and other web sites to search for snippets of code, frameworks or libraries and to get answers to questions that they have on how to code something up. I remember the first time I was able to ask a question via the internet and someone in Australia answered my question. I was stunned – today we all take that for granted. Additionally, most organizations now have API’s that are used internally and documented in a way that makes it easy for developers to utilize. Why spend hours attempting to write something when you can call an API or obtain some free code via the internet (just pay attention to copyright).
  4. Code For Tomorrow: This really highlights multiple things that you need to be aware of. One, what we write today, makes no sense tomorrow. I can’t even begin to tell you the number of times that I’ve written code, gone back in a year later and asked myself WTF! Seriously, sometimes what looks like an elegant solution today, looks like gnarly old junk later. So, a couple of things to remember. One, you need to create your code in a way that can be easily understood and is extensible. You don’t know today what business rules will change tomorrow that will cause you to have to go in and modify or extend the functionality that you’re creating. If you’re not familiar with the term micro services, you may want to educate yourself (see that whole learning thing again) so that you can create small snippets of code that can tie together to perform business functions. These can be reused and tied together in ways not seen today that will solve tomorrows problems. Additionally, take the time to comment your code. Each team is different as to the standards they have for when to create comments, but don’t think you are above having to comment your code. Someone else is most likely going to have to touch that code in the future – maybe you – and they are going to have no idea why you were making some of the coding decisions you have made to create your code. Be nice to your future self or that developer sitting next to you.
  5. Code Reviews Are Mandatory: These are no longer optional. Unless you are a team of one – and even then, I would encourage you to find someone to act as your code reviewer. Today’s environments are complex and you have many more things to worry about that could go wrong. Security being a critical component. This isn’t just about ensuring that your coding style conforms to the standards of the team, this is about ensuring that your code is optimized to run in your production environment, that it is hardened and can’t be used as the back door into your systems, and can be used to mentor each other on coding techniques. I have seen newbs provide important feedback to veteran developers thru code reviews and this is a great opportunity for your more experienced developers to share their wisdom with the developers that will grow within your organization.
  6. Unit Tests Are Mandatory: If you’re not testing your code, go back to square one and do not collect $200. Seriously, it’s 2019, if you don’t understand how critical unit tests and integration tests are to the success of your code, then get with the program. It is going to be tough for you to add value to the team you’re on if you’re are constantly breaking things – no better way to break bonds with your team. My teams will tell you that I’m very passionate on this point, probably only 2nd to team members understanding the data flow. Whenever I speak with high school or college students, I always tell them that if you don’t understand how to test your code, than you shouldn’t start writing the code. By the way, testing code doesn’t mean just testing the ‘success paths’, it means digging in and actually trying to break the code by using unexpected values or disconnecting things that your code believes should be there to successfully process whatever it is your creating. What happens if the call to the API fails because someone actually removed the location where the API is located or wiped out the service? What happens if you pass a numeric in where a string is wanted? What happens when the user fills out your forms with junk? What happens if they trying to inject SQL thru your forms? What happens if a bad actor attempts to use your API to sneak their way into the organizations systems? Plan for the worst and test to ensure it can’t happen – or at least reduce your risk exposure.
  7. Your Estimation Skills Suck: Sorry, but almost every new developer sucks at making estimates. You’re too aggressive, thinking you can do more in a limited amount of time than you actually can. You’re not thinking thru what it takes to actually design, build, test and deploy your code. That’s not a bad thing, you just don’t have the experience yet. Before you tell someone that you can have that code done in a week – check in with your mentor and get their feedback. Trust me, you don’t want to be giving out dates that are unreasonable. One there will be an expectation that you meet those dates, and two, you’ll get a reputation for not being able to deliver. Learn from your peers and let them help guide you – it’s ok to say, ‘Hey, I need to review this with my boss or my mentor. Give me till the end of the day and I’ll let you know when I can have this done for you.’.

Here are some additional thoughts on specific items mentioned above that dive deeper into understanding the data used by the system, the flow of data thru the system and code reviews:

- Back to Basics - Data
- Follow the Data - Software Design, Development and Testing
- Code Reviews - A Must for any Team!

Developing code is more than just walking into the office, plopping down into your chair and pounding the keyboard. You’re now an integral part of the success of your team, your department, your organization and your customer. Take the responsibility seriously, and remember that you’re in the role you’re in to add value. Set yourself up for success by understanding your role and doing the things that will make the team realize that you want to be a part of the success, not to steal time away and make their jobs harder.

If you'd like more information on my background: LinkedIn Profile

Monday, April 1, 2019

Back to Basics - Data

Two things happened recently that brought me to the point of writing this post …

  1. I was meeting with a candidate for an open role inside my organization and the individual began discussing how he tackles design and development. My ears perked up when I heard him mention that he creates a data map to understand what needs to happen to individual pieces of information as they move thru a proposed solution. Only when he understands the data does he feel he can make a judgement on whether the proposed solution will work or feel that he can properly define a solution if one doesn’t exist.
  2. I’ve been playing with a small code concept with a couple of buddies outside of work – we are all doing this just to explore some concepts and because at heart we still like to geek out. Amazing what happens when you're a coder, but you can’t touch the keys during your day job! Anyhow, we were having a chat about our little app concept and immediately all 3 of us began tracking the data elements we would need and marrying these data elements up to potential screen flows. The discussion always came back to the data, what data would be available at any given point and what manipulation of the data would need to take place between different visual aspects that the user would have access to in the app.

As many of you have read in previous columns, I’m a firm believer in understanding data. In my opinion, if you don’t understand the most discrete data elements being used by an application – where they came from, how they are being manipulated, what the contract is between functional elements of code and how they are presented to the user – you will never have a true grasp of the problem you are attempting to solve. And if you don’ t understand the problem, how do you test for and claim success! So how do we, as professionals, ensure that we understand these discreet element, how can we use that information to harden our applications and ensure that we are producing rock solid systems?

Data elements can be broken into 2 distinct types that have meaning to a developer – stored (permanent) data elements and calculated (transient) data elements. Stored data elements are those pieces of information that are physically stored somewhere that the program can read from at any time and can write to as needed to update the value. Calculated data elements are transient, at some point in the program the values are identified (calculated), used and then discarded.

Stored Data Elements (Examples)

  1. Application Configuration Information: Service API Locations, Authentication Keys, Application Rules
  2. Multi-Tenant Configuration Information: Images, Application Rule Overrides (Customizations), Colors
  3. User Configuration Information: Colors, Alerts
  4. Data Retained in a Database: Customer Tables, Invoice Tables, Inventory Tables, Indexes, Relationships, Views

Calculated Data Elements (examples)

  1. Days until loan payment due – calculated from stored Date Due
  2. Forcing a string value to upper case for comparison and/or display – uses stored values but does not need to be stored itself
  3. Calculating the payoff amount of an open loan if paid today – uses stored values but does not need to be stored anywhere

As a developer, it is our role to understand how each distinct data element is received, what manipulation needs to take place before we display the value, store the value back, pass the data on to the next function or used in another calculation. You need to understand the boundaries of what is acceptable and you need to plan for exceptions when the data does not fit within the defined boundaries, does not exist or causes the system to respond in an unplanned way.

For my purposes, I take data mapping beyond the typical definition used in development. Most people will refer to data mapping as the exercise needed to understand the underlying data schema that an application utilizes – being very simplistic the database(s), table(s) and field(s) needed by the application. I have always extended this definition. To me data mapping includes the following information:

Data Schema – the database(s), table(s) and column(s)/field(s) touched by the application. It will include key information needed by the technical team – architects, leads, developers, quality analysts and test automation:

  1. Database configuration information: Server Location, Port Information, Access Authentication Information
  2. Table configuration information: Table Information, Relationship Information, Index Information, Column(s)/Field(s) Information (including constraints, defaults, boundaries, lists)
  3. Views needed to support the display and manipulation of data within the application

Application Configuration Information – this is the stuff that allows the application to ‘prep’ itself, make all the connections it needs to various databases, services, file systems so that it can run. Typically this information is stored in the file systems – Config, Parameter, JSON, YAML, XML, etc.

  1. Where is the email server and the associated connection information that you need so your app can send emails? Server names, ip address, authentication information.
  2. Where is the message service and the associated connection information that you need so your app can send SMS messages? Service address, authentication information.
  3. Where is the logging service and the associated connection information that you need so that your app can log errors? Server names, ip address, authentication information.
  4. What are the default rules used by the application? Sometimes instead of hardcoding logic of how a piece of data will be manipulated, you define rules that the application will read and then use to process the data.
  5. What are the internal server addresses and connection information that the application needs to provide all planned functionality. Server names, ip address, authentication information.

Multi-Tenant Configuration Information – this is the stuff that allows the application to understand what ‘organization’ the user is accessing so that data is segmented properly and that the correct UX Schema and Functionality is made available. This information can be stored in the database or alternatively can be stored in the file systems – Config, Parameter, JSON, YAML, XML, etc. My personal preference is to store this stuff in the file system, not in the database, but each developer has their own feel for how they will store and manipulate this data.

  1. What are the default color schemes used in the UI? If a ‘tenant’ wants to override the colors, what colors do they want?
  2. Where are the default images used in the UI? If a ‘tenant’ wants to override them with their own images, where are they located?
  3. Where are the tenant application logging files going to be kept?
  4. Is there going to be a difference in what gets logged for specific ‘tenants’
  5. Can an administrator turn on/off functionality for a specific ‘tenant’ – if so, this needs to get recorded somewhere so the system knows how to behave.
  6. What are the overrides for the Application Configuration Information? File Store changes, authentication keys, database specific configs, default rule overrides.

User Specific Configuration Information – this is the stuff that allow us to specifically configure the user experience, menu items, colors. Most people keep this stuff in the database, but it is possible to keep this in the file system – just remember, you need to be able to scale for the number of users you expect to access the system.

  1. Can the user override color schemes?
  2. Does the system allow the user or an administrator to customize the menu options available to the user?

Calculated Elements

  1. Need to understand where in the app that calculated values will be used.
  2. Document the calculated values that the system will need.
  3. Example: Current Loan Payoff Value – the system stores the following information: Current Loan Outstanding Amount, Loan Interest Rate. The system will calculate the following information: Daily Interest, Number of Days Interest In Current Period, Current Interest Due, Current Loan Payoff Amount
  4. Example: Average Sales for Current Month – the system stores the following information: Date of Invoice, Invoice Total Amount Due. The system will calculate the following information: Sum of Invoice Total Amount Due, Count of Invoices For Current Month, Average Sale for Current Month

What I’ve discussed above is at the 50k foot view. Specifically on the database design stuff – as you begin to utilize apps out there that allow you to describe your databases, tables, columns, relationships – you’ll see that there are a lot of additional descriptive elements that these programs allow you to document. You’ll need to decide how much of that functionality you take advantage of, what value it brings to the team and for future support purposes. Remember, think thru how someone will maintain your design and code 18 months from now and what appropriate information that they will need to make their lives easier.

As you are sketching out your thoughts on your application, this is the stuff that will ensure that you get it right. That you understand what is happening as the data moves thru your system and then how you can test the application to ensure that you’re handling the data properly. If you are the total team – then you can keep track of this stuff with open source tools and/or spreadsheets. If you’re working with a team – get agreement upfront on the tools you’re going to use to manage and share this information – whether they are proprietary tools or open source tools.

All of the above are living elements that need to be continuously updated throughout the life of the development cycle and the application lifecycle. As you actually get into the application design and layout the specific logic flows associated with user interactions, you will most likely end up changing information at all of the layers discussed – modifying and changing tables/columns as well as potentially adding new tables/columns. Your configuration specific data and rules data will also change – keep the documentation up to date so that when you have to go back and support it months or years after it was originally developed, you’ll understand what all of the discreet data elements are, why they are there, how they are used, where they are used and what calculations are used to manipulate the data.

As you work thru identifying the above information, you’ll naturally begin to identify the class definitions you’ll need and a skeleton of the properties and methods that will make up the class. Document as much of this as possible up front, it will save you countless hours as you not only create the app initially, but more importantly as you have to come  back and maintain the app.

If you'd like more information on my background: LinkedIn Profile

Wednesday, February 20, 2019

Software Development - Attracting The Next Generation

I continue to enjoy my career - having worked for, and been mentored by some very talented people along the way! Today, I’m am lucky to work with an incredibly gifted group of professionals. From the team members that work directly within my organization to the team members that we support and interact with every day, this is a group of people committed to making a difference for our the financial institutions, merchants, fintechs that we do business with daily and the card holders trying to manage and spend their money. On a daily basis, we all get to see the impact we have as we help our customers manage their business and assist consumers making purchases across the world.

I am also lucky enough that I’m able to spend time with students across the Central Iowa area, promoting careers in STEM (in particular, careers related to software development and quality assurance). This ranges from kids as young as 10 to students getting ready to graduate from college. This is the next generation that will drive innovation – data analytics, artificial intelligence, serverless technologies, containers, virtual reality and more that I/we haven’t thought of yet.

Sometimes I get direct 1-on-1 interaction with students and at other times it is speaking to groups of 50 students. I enjoy the opportunity to talk about what make the industry tick and what the individual opportunities are within these fields. There are things these young minds need to know:


  1. Software Development is an opportunity to have incredible impact on the organizations and the consumers of the technology you build! As the cost of entry to the technology has come down over the years, people have access to systems and technology that are fundamentally changing the way that people live their lives. The most recent example is the Apple Watch 4 and the built in ECG capabilities that are already saving lives.
  2. Software Development provides opportunities every single day! This is not a job where you do the same things day after day. If you want variety, this is the role for you. Being a developer gives you the ability to creatively solve problems every day and those problems will be different. You will not be sitting in an office looking at the same types of reports and data every day and making similar decisions, you will be solving unique problems and challenging yourself.
  3. Software Development provides unique opportunities to grow and advance within an organization! As a developer, you will be exposed to and have the opportunity to drive change within the organizations where you work. These experiences give you the unique ability to understand the business and to contribute in a way that others may not be able to see. Your ability to see ‘connection points’ that might be lost on others gives you the ability to recommend and make changes that drive efficiency, improve the customer experience and increase the profitability of the organization.
  4. Software Development means you will be in demand! There is a current shortage of software developers, this is a trend that will get worse as the baby boom generation continues to retire and leave positions open. This means companies need you! If you need any proof of this, go out and look at all the openings for software developers – they are literally everywhere. According to the Bureau of Labor Statistics, there will be a 24% growth in the overall number of software development jobs thru 2026.
  5. Software Development gives you flexibility! More and more companies are allowing their software development team members to work remotely – if not full time for at least part of their regular work schedule. If you can prove you have the ability to work independently and still drive to milestones and hold yourself accountable, companies will provide you more flexibility. In fact, traditional ‘coastal’ technology companies have recently announced initiatives to train and hire workers in rural Iowa. This trend will continue and developers will find opportunities to work wherever they choose to live.
  6. Software Development pays well! As a software developer, you will need to establish your bonafides, once you have proven you are capable, you will be rewarded. Software development is one of the higher paying professions and will give you the ability to live comfortably. Current average national salary for entry level software developers is $68K. Yes, depending on location, that number will be higher or lower, but it is nothing to sneeze at when comparing to other jobs. And, software developer are ranked as the #1 in the top 100 jobs nationwide, as well as the #1 STEM Job.


To be a really good software engineer, means to understand the above and then choose to passionately pursue this career choice. Being a really good developer means that you are eager to explore new technologies, learn new development techniques, invent new ways of doing things and to be creative. It means taking all of that, and using it to work on different projects – no day will ever be the same. It means dedicating yourself to making the time to work on smaller side projects to explore and hone your skills.

We should be encouraging students as early as possible to explore software development. Kids in grade school can start with on-line tools like Scratch from MIT (https://scratch.mit.edu/). If they get comfortable with Scratch, then they can move up to Python, Ruby or even JavaScript. With the technology available today, there is nothing to stop them from learning. Online manuals and tutorials, online forums where they can ask questions and be mentored.

This generation has access to so much information and it’s all available at their finger tips thru their smart phones, laptops and computers. Let’s encourage them to explore opportunities where they can have fun, make a difference doing something they love and make a nice salary along the way!



If you'd like more information on my background: LinkedIn Profile

Monday, January 7, 2019

The Education of Software Developers

When I first entered the ‘professional workforce’ years ago as a software developer, it was not a requirement to have a 4 year degree to be able to get a job. Several things have changed along the way that have made it more difficult for high school students to get ‘formal educational’ training and to then be able to go out and successfully apply for and land a software development job. I don’t believe all of these were good things.

  1. Many high schools that used to teach computer science (programming courses) stopped doing so.
  2. State educational departments made rules that disallowed many teachers who had been teaching programming from teaching those classes at high schools
  3. State educational departments made rules that disallowed many working professionals from teaching computer science at community colleges

Combined, these rules limited the ability for students to explore software development as a profession and limited the ways in which students could get formal education on how to become a software developer.

On the plus side, several things have happened that have made it easier for young students to explore software development. If only these things would have been around when I was a kid:

  1. The internet … boom!
  2. Open source development tools – languages, compilers, frameworks, editors, IDEs, test automation frameworks
  3. On-Line tutorials
  4. On-Line college level programming courses
  5. On-Line help forums
  6. GIT – online source control and sharing of code
  7. Bootcamps teaching programming (primarily Web and Java)
  8. Scratch online programming educational tool for students in K-8 – developed by MIT Media Lab
  9. Lego Mindstorm competitions

The problem, we don’t talk about the learning opportunities early enough in school to attract students to the idea that they can become software developers. In many school districts, students have no insight into any of this until they graduate high school. That is too late. We need to be exposing kids to the idea of software development very early in their educational career – think grade school. Then we need to reinforce those opportunities with additional educational opportunities thru middle school and high school. The goal should be to allow those interested in pursuing this to potentially get out of high school and find entry level software development roles. Not every student would be able to do this, some will need additional education, or may want to pursue additional education to perform within specialized areas – artificial intelligence, data analytics, etc.

I would also argue that we need to rearrange graduation requirements at the high school level – computer science classes should be counted as part of the core curriculum, either as language classes replacing Spanish, French, German, etc., or as math and science classes. Additionally, every high school should be offering computer science classes – either locally or thru remote class arrangements with the nearest community college. I know of high schools teaching Java, C++, C#, and networking (providing CISCO certifications at the end of the class). These kids are old enough to understand these concepts and get a jump start on their post high school education or prepare themselves for direct entry into the workforce. There is no reason not to provide these learning opportunities and have students work ready for entry level programming positions by the end of high school.

Can it be done? Yes, even with the constraints that were in place when I was a kid – no internet, no open source software, no PC’s, I was able to learn enough that I was doing contract programming by the time I was in high school. I personally have hired kids that were graduating from high school that showed they had the chops and the passion to be a developer. Does it take a little extra hand holding? Yep – it sure does, but it’s worth it.

I’m not trying to devalue a college education. There are reasons to pursue a 4 year degree, but we also must be cognizant of the challenges we face today as employers:

  1. There is currently a shortage of skilled software developers that will only get worse as the baby boomers retire – some sites are reporting a shortage of at least 220,000 software developers in the US.
  2. Currently colleges are graduating approximately 30,000 computer science majors each year.
  3. Unemployment for folks in the software development role is currently running around 1.9% (mid 2018 stat)

We need to think outside the box on what we are doing and how we are making this career path accessible to young students. The big boys on the block are starting to change their hiring methods – no longer requiring degrees. 



Be nimble, look for ways to help out your local schools, find ways to let kids explore opportunities in software development. Encourage your kids to go online and find coding learning opportunities. If we don’t figure it out, we are going to be at a disadvantage as we attempt to find bodies to fill the jobs that we need to be successful.

If you'd like more information on my background: LinkedIn Profile