Peter J. Hanson - Establishing Ability and Credibility
Seeking Chief Architect & Senior Software Developer Opportunities
I'm technical and easy to work with.
15+ years of technology experience.
Resume | 906-281-1178 | Peter@pkhanson.com
I'm interested in helping you navigate technical complexity to solve your problems and see your ideas evolve into working solutions. I have over fifteen years of experience in designing and rolling out custom enterprise and web-based solutions as well as providing support, upgrades, and consulting on existing systems. I have served the following markets and business models: design, startups, auction operators, communications, sales, housing, dealerships, entertainment, healthcare, professional services, publishing, manufacturing, engineering, retail, educational, non-profits, and government organizations.
My areas of expertise include systems analysis and design, interface design, rapid application development, infrastructure analysis and maintenance, implementation rollout and support, and systems administration. I have worked in these capacities for many organizations across the world.
What follows introduces my years of experience at-a-glance, testimonials and letters of recommendation, previous work, code samples, technical skills, information you may find relevant, personal information, and my final thoughts. If you find that I've not written about something that you'd like to see, I hope you please let me know, and I'll get it to you right away.
Years of Experience, Core Strengths, & Education At-a-Glance
- Technical Solution Design:
I have been working with customer teams since 1995 to deliver technical solutions. I focus on systems using PHP, SQL, AJAX,
Apache, and Amazon's Services. Due to my near exclusive focus on LAMP-stack development since 2001, I have developed skills
that I believe enable me to contribute to any LAMP application, whether it be maintenance, creation, or consulting.
- Software Development Team Management & Leadership: Since 2001, I've led a development team within Up and Running.
- Software Development Experience
- Programming: since 1994.
- SQL and Database Design: since 1997.
- PHP: extensively since 2001.
- Supporting Web Languages (CSS, HTML, etc.): I've been using most of these since they were created.
- Apache & Linux: since 2001.
- Amazon Services: since 2006.
- Core Non-technical Strengths: Translating business requirements into working systems that add value, understanding the importance of communication, believing in the balance of pragmatism and perfectionism in programming, and taking a personal interest in your success.
Most of my software development and management knowledge has been through self-learning via experience
through application and reading online and print materials. However, I do have a B.S. degree in
Management of Information Systems from Michigan Technological University
(MTU). I also nearly have the credits to have a Mechanical Engineering degree as well. It's a
well-known university in the engineering community, and such technical companies as Google, Microsoft,
and IBM recruit MTU graduates. GE, GM, Ford, Dow Chemical, Boeing, and many other multinationals
recruit MTU graduates as well. As another means of self-learning, I really enjoy exploring new frameworks for software development processes and talking with and learning from people who have worked in the trenches for some time. To that end, I earned my certification as a ScrumMaster. I also read a good deal online about software development processes, with Scott Amber’s writings being some of my favorite material.
Testimonials and Letters of RecommendationCommunicating Success from Previous Clients' Perspectives: here are several letters of recommendation from clients of systems where I served as Chief Architect and led the Development Team. With the following, I'd like to focus on some of the intangibles that Up and Running offers in terms of how we do the work and how we build relationships with our customers. Here are the summaries and links to the full letters:
Artsopolis' Letter of Recommendation -
Artsopolis has 24 community sites in its network, with an average of 2.5 million unique visitors per month. They can create a new network website in less than four hours now, a 2,000% improvement. Jeff Trabucco, Director of Artsopolis Network, considers us a part of the organization he leads, and kindly writes, "Up and Running has also helped us shape our business strategy and processes. We feel comfortable discussing vision, mission, strategy, and tactics at the business level and the business operational level. In a sense, I consider them my CIO in addition to my development team."
Portage Health's Letter of Recommendation -
This relationship has resulted in a beautiful website (Portage Health )
and an equally beautiful architecture that drives Intranet and Internet operations using the same data. Karin Van Dyke, Vice President of Portage Health, said some kind
things about us in this letter, including, "What impressed me most about Up and Running's approach to our project was their vision and leadership, commitment to the customer,
insistence on setting realistic goals with succinct timelines, organization and project management, education and coaching."
Paragon Business Solutions' Letter of Recommendation -
Karen Hamilton runs a service organization called
Paragon Business Solutions, Inc
that helps companies improve their quality and achieve/maintain quality certifications such as ISO 9001, ISO 14001, and BSI 18001. Since Karen has a high standard for
quality in processes, I'm very pleased to have received her recommendation. Her letter notes that, "We have been working with Up and Running for almost two years. During
that time they have shown to be extremely competent professionally, and, just as important very customer focused." She also cites an example of where we go beyond the scope
of work to troubleshoot and correct a problem with the end customer's IT infrastructure that was impacting the project's success.
Advancia Corporation's Letter of Recommendation -
I believe this project highlights our customer commitment and mentality to do what it takes to ensure the customer is successful. We were asked to help support them onsite
from a software perspective, and we ended up helping them in many other areas outside the scope of our duties, including printing batch runs into the early morning,
configuring and supporting a LAN and wireless network, and providing direct customer support to our customer's customers (event goers).
Rotary's Letter of Recommendation -
We served three of the districts in one of the largest service organizations in the world, Rotary. This sentence says a lot, "The product was great, but I think it's the
dependable service, flexibility, and cooperativeness that really sets Ian and Up and Running apart." (Ian McKilligan is my business partner, and manages the operations of
the company. I led all the development for this project.)
Physician's Insight's Letter of Recommendation -
I'm proud of this solution because we were the third software provider David and Carol contracted with for this work, and we accomplished much more and at a lower cost
than the preceding companies did. Through our work I think we reestablished their trust in the software development community, which is another accomplishment because
I dislike when others tarnish our industry's reputation. Also, it's gratifying to read their comments that we delivered a system that works how they want it to. This is
extremely pleasing to read given that we were under budget and on time, making this project a big success in the customer's and our eyes. I attribute this to our agile,
personal style of developing software, and I believe it's resulted in a relationship where we're a trusted partner with Physician's Insight.
Previous Work: sites I've personally developed, managed, and implemented:
Here are some quick links to sites I've implemented or helped with:
- http://voices.com/ (Lead Developer, back-end and front-end work; no graphics design)
- http://artsopolis.com/ (Contributing Senior Developer, back-end and AJAX work)
- http://monomachines.com/ (Contributing Senior Developer, back-end work)
- http://sendpepper.com/ (Contributing Senior Developer, back-end work)
- http://emailinstitute.com/ (Contributing Senior Developer, back-end work)
- http://portagehealth.org/ (Lead Developer, back-end and front-end work; no graphics design)
- http://nemesisinteractive.com/ (Lead Developer, back-end and front-end work; no graphics design)
- http://oilandgasinvestor.com/ (Contributing Senior Developer, back-end work)
- http://remedylife.com/ (Contributing Senior Developer, back-end work)
- http://sportscardigest.com/ (Contributing Senior Developer, front-end work; no graphics design)
Most of my work is on the programming of Intranet sites or administrative features of public websites. Before there were other good frameworks out there, I created a framework that has all the features as described in the PDF document titled, Up and Running -- Complete Listing of UAR ABLE System Features.pdf. This framework supports over 30 customer websites currently. This includes over 14,000 man hours of work. It handles administrative operations, provides database transparency, manages data relationships, administers user management, and facilitates code reuse. I no longer recommend our framework for use today for anything other than very custom solutions that wouldn't benefit from using community-driven frameworks. I remain quite happy with the strong frameworks and platforms supported by excellent communities, and recommend these to our clients. Here are some customers who use or have used my framework:
- One is at GS Engineering . They use my product to manage all their projects, track all billable time, manage payroll, and more.
- Another is at Physician's Insight. I developed a radiology management website that allows for easy communication between physicians and radiologists.
- The internal workings of Portage Health are notable.
- I developed a website using Perl to manage Little Caesars Amateur Hockey League's teams, statistics, and scheduling. This is the largest amateur hockey league in the world.
Return to top
Code Samples: most are php-based; I can get you others if you'd like:
PHP Code Samples
- account.php ( source code - text file ): This is a data model class that holds information on a project or charge account. It also has accessors for its child data that uses the lazy load pattern.
- conditionbase.php ( source code - text file ): This is an abstract base class for the condition component of an alert. An actual test extends this and provides the data that the base methods run against.
- entityrelationship.php ( source code - text file ): This provides a generic association model for any two entities in one of the systems I developed. An example usage is associating a person/contact record to a system user record or an address record.
- file.php ( source code - text file ): This is a file abstraction that represents a file on the file system. It provides convenient methods for accessing various properties and can tie into other parts of the framework.
- objectparser.php ( source code - text file ): This is a recursive parsing routine that uses reflection to analyze an object to generate a list of values from that object that can then be indexed through my search engine.
- persongroup.php ( source code - text file ): This is a sample datasource used to abstract out data persistence of the data model layer. It handles all SQL queries for this type of entity.
- single.php ( source code - text file ): This is a component called a displayer that takes a particular model and is designed to display it in some way. The models are assembled by the controller component of the framework and in the view is where the displayer is specified. It's then hooked into a certain point in a website's template.
- followup-model.php ( source code - text file ): This is a primary object model of the system. It provides properties to hold data about a follow-up and any methods that describe actions on the follow-up. A datasource that implements the follow-up interface can be set to the model for persistence handling. This datasource (please see "followup-datasource.php") could be tied to a database, an RSS feed, another application, a SOAP interface, etc.
- followup-datasource.php ( source code - text file ): This class provides methods for retrieving follow-up data and persisting it to a database that's configured through the ADODB abstraction layer. It conforms to an interface that the follow-up model and follow-up list models look for in their datasources.
- processfollowup.php ( source code - text file ): This is a sample command in the command controller system for processing follow-up data from some form of HTTP GET/POST submission. This is usually the last stage in data processing, after validation and taint testing commands have cleaned up the data.
Return to top
Programming & Other Technical Skills
- PHP 4/5.x
- I've been using PHP since 2001, and it's my primary language. I can support any LAMP-stack development effort.
- OOP: most of the code I write is object oriented with a focus on reusability and resiliency to change. When I decide not to write OO code, it's for a specific reason.
- Here are the patterns I apply in PHP regularly: Strategy Pattern, Factory Pattern, Singleton Pattern, Command Pattern, Decorator Pattern, Template Pattern, Adapter Pattern, Iterator Pattern, State Pattern, Observer Pattern, MVC Pattern, Skinny Controller/Fat Model Pattern, and Inversion of Control Pattern.
- Here's some design principles I apply in PHP regularly: Encapsulate what changes, DRY principle, Program to interfaces and not implementations, Open for extension but closed for modification, and Focus on loose coupling.
- Libraries commonly used: Apache, Bzip2, cURL, FTP, GD Graphics Library, IMAP, LDAP, Mcrypt, Mhash, MySQL, OpenSSL, PayFlow Pro, PDF, PostgreSQL, Pspell, Regular expressions, SMTP, SimpleXML, XML, and ZIP.
- Pear: I've used several packages from it, including the debug framework, phpUnit, and phpDocumentor. I also use the class naming structure that the PEAR libraries follow.
- Other experience: IMagick and memcache.
- Databases: two of my core strengths are database design and database management:
- I have been using databases and SQL since 1997. It is one of my core strengths.
- I manage or have created hundreds of different databases in MySQL/PostgreSQL for different purposes and different clients.
- I'm able to take a concept, design the database formally using Entity Relationship Diagrams, Data Dictionaries, and other supporting modeling conventions as needed, and implement the database.
- I'm well versed in using existing databases, whether it be simple usage, extension, improvement for faster and safer performance, upgrades, or other aspects of database usage and maintenance.
- I have extensive experience writing SQL and know nearly every nuance of the SQL 99 standard (basic queries, types of joins, utilizing sub queries, views, temp tables, transactional processing, etc.), including a number of proprietary features like stored procedures and VBA scripting in Access.
- Though the majority of my experience is with MySQL and PostreSQL, I have experience with these as well: Oracle, SQL Server (including migrations), Informix, DB2, FileMaker, Caché, Access, and FoxPro.
- I've modified existing open source databases to perform better by adding or extending features.
- I've created systems with shared database access among different applications, running on different platforms.
- I am well versed in advanced database operations, such as transition management, triggers, views, complicated queries, and stored procedures.
- I've also used a number of abstraction layers for database communication, including ADO, ADOdb (PHP), DB (PHP), and NpgSQL (more of a driver than abstraction). Features utilized in these layers on past projects include: stored procedure execution, caching and performance enhancers, record set selectors, and performance monitoring.
- Most of my applications that involve a database are built with a datasource layer between the main system objects and the actual SQL queries that manipulate the database, accomplished using the Domain Object Model and the Data Mapper pattern. I've also written applications that use the Active Record pattern.
- I have used advanced stored procedures and triggers to automatically update dedicated un-normalized history tables when data in the primary tables were changed.
- In all of my programming work, I've used SQL for database operations.
- I've written queries for accessing data directly and routines that assemble SQL on the fly.
- I've worked with existing SQL statements, both using them as is, and optimizing them if needed.
- I use Prototype, jQuery, MooTools, Ext JS, YUI, Dojo, and Script.aculo.us regularly. I can talk through their differences, and why I like certain ones for certain applications.
- I use XML to support configuration settings and AJAX output on various web applications.
- I know how to use XML and JSON for AJAX requests.
- I've built shopping cart-style systems out of AJAX.
- At Up and Running, XML supports configuration settings and AJAX output on various web applications.
- At PCI, XML served as a storage mechanism for quality data. XLST allowed for various presentations of that data on the Intranet.
- I designed and deployed SOAP interfaces.
- I used DTDs to generate custom APIs.
- I can syndicate any content for use in mashups, portal pages, RSS readers, and more.
- I have been using these since they were created, and my preferred editor is a text one, meaning I prefer to hand code my XHTML and CSS as it produces cleaner code.
- My work is compatible with the major browsers, whether they support W3C compliancy or not.
- I am familiar with SEO Semantic coding and markup, and understand the importance of writing my code in this manner.
- I generally design and write XHTML or DIV style layouts for sites, utilizing CSS for markup. I can work with the older table layout method as well.
- I have worked with templating engines before, and wrote one for the UAR ABLE framework as well, which integrates into a custom CMS system. I can use any templating system you wish to if you prefer to use one.
- Graphics designers often have me take their works of art, and convert them into web-ready CSS and XHTML.
- I am confident I can use XHTML and CSS to do anything you need.
- Please see my Experience in using and interpreting web standards (browsers, accessibility, and validity) section for more relevant experience in this area.
- Amazon Web Services (AWS) and Management
- As it is one of my core competencies, I am able to help with any Amazon Web Services need you may have. The following are some examples:
- Amazon Simple Storage Service (S3):
- I have implemented S3 for all of the internal systems for Up and Running; development, testing, and production servers; as well as for many of my clients. One client is one of the largest SEO internet marketing firms in the market.
- A wrapper script was written to provide an abstraction layer for the rest of the client code. In this manner, if the API signature changes on S3's side, then I just have to change the internal implementation of the wrapper. Also, additional business logic in how S3 is utilized can be contained in the wrapper or injected at runtime to help govern operations.
- Up and Running and many of our clients have moved to S3 to reduce bandwidth consumption/needs on our servers, along with the administrative oversight and costs that need to occur for internal servers.
- Another benefit for many clients is that the S3 service serves up files quickly, usually much faster than internal servers. I find this particularly useful when a feed system is hosted on other websites. The images that make up the feed graphics can be put on S3 to save bandwidth and reduce the cost of transmission. These feeds could be viewed 10,000s of times in an hour, and would put a considerable load on the clients' dedicated hardware. Thus, in this example, S3 really saves money and results in a better user experience.
- Amazon Elastic Compute Cloud (EC2):
- I have created machine images to manage Up and Running's critical services and developer resources.
- I wrote a Perl script, utilizing the instance control API, to dynamically mount EBS volumes and attached Elastic IPs in an instance during startup using the user data scripting system. This script allows for a machine instance to be configured in such a way that configuration and user data is persisted between reboots. The mounting overlays critical areas of the operating system so that configuration changes and user data are stored on the EBS volume, making the running instance work more like a dedicated server.
- I utilized the elastic IP system to assign a public IP to the instance, and configure a round robin load balanced system when load dictates it.
- I use EBS snapshots to handle backups of EBS data, along with an rsync-based offsite backup system to protect all server data.
- Amazon SimpleDB:
- I have explored and tested this.
- I have presented this to clients, and they have not chosen to go with this solution at this time.
- Amazon Mechanical Turk
- I explored the implementation of this for a customer who needed some manual assistance in a workflow with some specifically-defined tasks.
- The API makes it easy to integrate these features into a system such that human-provided work can be submitted into the principle application.
- Other Amazon Web Services: with the experience I have using Amazon's Web Services, I am confident in my ability to quickly use any of their other or future services.
- For an Up and Running customer, the largest amateur hockey league in the world, I wrote a team management system that ran a 900+ team hockey league that had over 10,000 user accounts.
- I currently use Perl for maintenance tasks and one-liners in command line chained commands.
- I've used C# to write an online backup tool.
- I also used this to write a client-based application to work with my web-based framework for entering time easily.
- I know the methods with which applications can talk, and the abstract pros/cons of each approach. In my career I've worked with numerous APIs, interfaces, and code to make different tools work together well.
- I can configure any SOAP or REST interface needed to make a system work with other systems, or design and deploy a specific, custom API for interaction with a third-party application.
- For social networking purposes, I've done some interesting work:
- Twitter: I've created a Drupal block for a social media portal site that uses the Twitter API to display a list of the most recent tweets on a given Twitter account. The block can be configured via the Drupal Admin Panel, and allows the website owner to enter their Twitter account details and configure several parameters regarding the display of the tweets. Additionally, I have created a Drupal module that hooks into Drupal's existing blog system, allowing the user to post an announcement to twitter automatically when they create a new blog Post. The module adds a new checkbox option to the page for creating blog entries, and, if checked, will use Twitter's API to publish a new tweet for that blog post.
- Facebook: The social media portal site is integrated with Facebook Connect for user authentication and comment posting purposes. For user authentication, this allows a visitor to log in into the site using their Facebook username and password, and does not require them to register a separate account on the social media portal. Existing Drupal users can also authenticate via Facebook Connect to take advantage of the comment posting integration. When a user posts a new comment, they have the option of automatically publishing information about that comment back to their Facebook account. Additionally, I have integrated Facebook with Drupal's blog system in the same way that Twitter is integrated with it. When a new blog post is created, the user has the option of automatically publishing information about that post back to their Facebook account.
- MySpace: A MySpace option can be presented on Drupal's blog posting form as well, giving the user the option of automatically publishing new blog posts to both of those services.
- Reddit: I have explored integration methods for this service.
- Digg: I have explored integration methods for this service.
- RSS Feeds: In addition to sending information out to social sites, the social media portal can also receive information from any site in the form of an RSS feed. The Blog owner has the ability to monitor RSS feeds from within the Drupal admin panel, and can choose to post any story from the feed into their own blog (with additional comments of their own on the story contents).
- I have explored Yahoo! Query Language (YQL): "The Yahoo! Query Language is an expressive SQL-like language that lets you query, filter, and join data across Web services." (Source: http://developer.yahoo.com/yql/ )
- I have used Authorize.net's Advanced Integration Method (AIM) to allow a proprietary e-commerce site to accept credit cards using Authorize.net, while still retaining their existing order-handling business logic. Credit card information was collected from the user on the Merchant's site, and securely transmitted to Authorize.net using cURL. The site also took advantage of Authorize.net's ability to store extended order information by transmitting order details and complete customer billing and shipping information with the credit card information. The response from Authorize.net was then processed by the script, and the proper code was executed depending on whether the charge was successful or not.
- I have customers who have me attend API design meetings to act as a consultant for them and for the third-party team of programmers they meet with for such discussions.
- Examples of interfaces I've worked with:
- Google APIs
- Twitter API
- Facebook Connect
- MySpace API
- Paypal's interfaces
- Various shopping carts
- VeriSign's Payflow Pro API
- Intuit's QuickBooks Interface
- UPS WorldShip
- USPS APIs
- I've used several open source CMS packages and frameworks, and have extended them using custom code. Examples: Drupal, Joomla!, WordPress, and ExpressionEngine.
- When I first started using PHP in 2001, I developed my own CMS within a framework that supports many features beyond strictly CMS features. The CMS I developed handled dynamic page and navigation creation, along with version-controlled content. I could create inline editing features as needed. I no longer recommend this to clients because of the rich CMS solutions backed by strong development communities that exist today.
- I've done CMS conversions, both from static sites and CMS-driven sites.
- I've helped companies define custom CMS operational oversight processes for their enterprises.
- Drupal: PHP Content Management System and Framework - Overview of Experience:
- I can implement any theme, implement any module, design custom modules, extend existing themes and modules, perform Drupal conversions, and lead any other Drupal need you might have.
- I've done conversions to Drupal 6 from Drupal 5 and from non-Drupal sites.
- I've handled lead development duties for a production site with 8,000+ registered users, and another site that had 20,000+ page views per month.
- One week in 2009, I had three companies independently ask me to finish what other development teams had started. I understand Drupal, but my core competencies, including a deep understanding of PHP and SQL, are what allowed me to contribute to these projects. I helped my customers achieve their goals with Drupal because I know the foundational aspects of programming, specifically PHP and SQL, at the expert level.
- Here are some of things I do and have done with Drupal:
- Maintain databases from development to staging to production using a custom script written in XML and PHP.
- Implemented internationalization implementations, including Japanese and Spanish.
- Integrated the Yahoo! Grids CSS system to work as a Drupal theme, fully-customizable within the constraints of the grid system. This reduced the time and effort required to develop themes.
- Rather than implementing Drupal on a standard setup for a high traffic site, I decided to use a SAN. A SAN allows remote storage devices to be connected to a server and are viewed as locally-attached devices. This improved performance of the site, and allowed for replication of data.
- Themes; here is some of the work I've done with themes:
- I can implement new themes based off of new designs to the pixel-perfect level. I know this because I work with customers who are professional designers with excellent eyes for perfection in design.
- Standard Implementations:
- I implemented user-oriented functionality based on Drupal's core functionality. Examples include: User Roles, Remember Me, Tracker Module, and more. Remember Me allows users to be remembered every time they login to a site. The Tracker module allows tracking of a user's posts and actions within the site.
- CCK (Content Creation Kit) is a core Drupal bit functionality I commonly use to allow administrators to define custom node types. I use CCK to help users not experienced in writing PHP/MySQL to have an interface for adding content to their sites.
- I implemented the FlashVideo module, which allows for uploading video to nodes in Drupal. The video is converted to .swf, and has built-in interfaces for the Dash Media Player and server support for hosting videos using Amazon's S3 servers.
- I have used the blocks interface to enable an administrator to define blocks of content to be shown in specific areas of pages within a site.
- I have written over 50 custom modules for Drupal; specifically, I've contributed to creating these:
- Actionable Events Module - creates a reporting system similar to what is implemented in Facebook that updates the owner of content when actions are taken on that content. For example, if a user posts a blog and a comment is posted on that blog, the owner will be alerted on their profile page.
- Anonymous Posting Module - uses Drupal hooks and allows authenticated users to post content anonymously. Records user id for the administrator to view, but for other users the content will appear to be posted by anonymous.
- Ask Module - extends the forum module to allow users to ask questions of a specific group. Uses the taxonomy categories as the forum containers.
- Comment Alter Module - extends Drupal's default commenting scheme to alter just about anything needed. It adds the no follow tag to all comments posted by untrustworthy users. It also spell-checks posts by users.
- Comment Rating Module - extends the votingapi module to allow voting on comments before this functionality was offered in the fivestar module.
- Community Site Content Creation Module - allows users to easily add products, websites, save favorite websites, ask group questions, ask individual questions, add a book to the site, and more.
- Limit Tags Module - hooks into the taxonomy functions, and limits the freetags a user is allowed to enter based on a predefined set of taxonomy tags. Has an autocomplete function built-in for users, and also suggests possible terms.
- Location Privacy Module - alters the behavior of the location module by storing user input in the database. A user can set their location to be viewable by no one, by other users marked as friends (extends the buddylist module, a contributed Drupal module), or viewable as a public listing.
- News Feed Module - mimics Facebook's news feed function in that it reports to users what their friends are doing on the site. Reports comments, posts, questions, and can be extended to update on other programmed actions. It can be digested as an RSS feed.
- Node Book Module - custom node type module that allows for users to enter a book that they like. Allows a user to enter a title, price, ISBN, and scrapes an image from Amazon.com to use as a descriptive image of the node.
- Node Generic Module - custom node type module that supports users' input of websites they prefer. Allows a user to enter a title, URL, and description of website, and attempts to scrape an applicable image from the site to use as the node's image.
- Node Privacy Module - this module allows a node to be marked as private, public, or viewable only by friends of the owner (extends the buddylist module, a contributed Drupal module).
- Node Question Module - custom node type module that mimics Yahoo!'s Answer's functionality. Questions are asked by users and are then answered by experts on the topic. Other users of the site can comment or rate (using fivestar module, a contributed Drupal module) the answer and question.
- Privatemsg Connections Module - extends the privatemsg module to make it interact with the buddylist module. This functionality allows a user to send private messages to other users who they have added as friends.
- Profiles Module - extends Drupal's default profile functionality by creating sub-navigation for the profile pages, adding extra functionality for message boards (using the guest book module), and creating customized searches that allow users to find others with similar interests.
- Questionrouter Module - extends the Node Question node type in that it sorts through the available experts on a site, and then tries to route a question to the proper expert. It performs the routing by comparing the taxonomy tags a question has with the self-defined expertise associated with the users.
- Questions and Answers Module - a module that mimics Yahoo! Answers. A user can ask a question that remains unpublished until an expert answers the question. Once answered, both are published to the community.
- SOAP Digest & Search Module - the module, connected to a web services API, uses SOAP to download the results, and display them in the Drupal site. AJAX was used to retrieve data from the server asynchronously.
- Taxonomy Module - extends the taxonomy term functionality to create groups based on terms. It provides a means to tag users and content, and allows users to add a taxonomy tag to their profile and view all content tagged with this term as part of a news feed grouping. The news feed was a custom module I developed. Its features were similar to a Facebook news feed, where a user who is part of a group can see all actions that occurred within that group. I also implemented tag clouds using the taxonomy module.
- Taxonomy Wikipedia Module - custom module that grabs definitions for taxonomy terms from Wikipedia. The definitions as well as pictures are then displayed within the homepage for that taxonomy term.
- User Tracking Module - a custom module that enables one user to track the activities of another user within a site. As an example, this permits a user to easily view all the content another user has created, and subscribe to an RSS feed of that activity.
- Various Utilities Module - handles everything from homeless hook_form_alter functions to styling search pages, profiles, forms, and blocks.
- Violater Actions Module - extends the flagged content module to allow an admin to block a user, delete content, unpublish comment, and send warning emails to troublesome users.
- Wikipedia Definition Module - attempts to add a definition based on Wikipedia content for each taxonomy category added on the site. Scrapes the content from Wikipedia, parses it, and displays it.
- In addition, I have used, modified, and/or updated the following contributed or core Drupal modules in a heavy-traffic production environment:
- Aggregator - publishes syndicated content using RSS.
- Amazontools - allows a user to input an ISBN or book title, and subsequently fetches info for that book from Amazon.com.
- Block - builds support for the block that is available in the theme. Allows an admin to add content to different areas of the page (blocks) whenever they desire. Can add new content by administering the blocks.
- Blog - builds the blog node type.
- Blogapi - extends the blog node type to allow for customizations.
- Buddylist - allows users to create lists of friends.
- Captcha - builds support for adding captchas to forms.
- Color - allows the administrator to change the color palette of a theme through the admin panel.
- Comment - builds support for the commenting functionality.
- Contact - builds functionality for creating a contact form to allow site visitors to contact the administrators.
- Devel - assists in developing, clearing caches, and updating content.
- Favorite_nodes - allows users to designate favorite items on Drupal sites.
- Fckeditor - adds support for the fckeditor, a popular WYSIWYG editor.
- Filter - allows for filtering of content. Can write custom filters to parse content, remove harmful text (code), and remove offensive words.
- Fivestar - extends the voting module to allow for a fivestar voting widget using AJAX.
- Flag_content - allows users to flag offensive content for future perusal by an administrator.
- Forum - creates the forum node type.
- Guestbook - builds support for a Facebook-style 'wall'.
- HOF - a hall of fame module that builds publicly-viewable statistics to give credit to users who cause a site to succeed.
- Invite - builds a form that allows a user to invite their friends via email.
- Karma - allows for a comment rating system based on a user's past comments. If a user has a good rating on previous comments, they are considered a trusted user.
- Help - creates help topics and text.
- Legacy - remaps deprecated style URLs to URLs usable by Drupal.
- Locale - allows for multi-language support.
- Location - allows users to input their location at the zip code or full-address levels.
- Logintoboggan - allows the administrator to set the destination page after a user logs in.
- Menu - builds support for the menu functions in Drupal.
- Node - creates support for nodes: adding, editing, moderating, deleting, searching, etc.
- Nodewords - a toned-down version of the taxonomy module that allows for meta tags on nodes.
- Path - builds support for creating readable URLs for pages normally labeled like /taxonomy/term/12/15.
- Ping - used to notify third-party sites of changes on one's site.
- Profile - builds support for the profile functions supplied by Drupal.
- Pathauto - automatically generates path aliases for nodes.
- Poormanscron - runs cron jobs on systems that don't have access to the cron application.
- Privatemsg - allows users to send private messages to each other.
- Profile_privacy - allows for users to set privacy on their profiles.
- Search - builds support for the Drupal search engine. Currently uses MySQL, but can use Solr.
- Statistics - creates reports on default Drupal values, and can be modified to add other site-specific stats.
- System - helps build the infrastructure Drupal is based on.
- Tagadelic - creates tag clouds with taxonomy terms.
- Taxonomy_super_select - builds a multi-select form for taxonomy terms.
- Taxonomy_xml - allows input of taxonomy terms using XML. Allows administrators to input a large number of terms.
- Taxonomy - builds tagging features.
- Throttle - allows specific modules to be throttled based on Admin decisions. If a certain module takes too much bandwidth, then this module can be used to only allow it a certain amount of processing power/bandwidth.
- Token - allows for small bits of text to be entered into documents using placeholders like "%content", as well as allowing for other modules to create their own custom tokens.
- Tracker - allows for tracking of users based on what actions they have done on the site. It can track content posts, track comments, and can be modified to track other types of actions.
- Upload - builds support for uploading files.
- User - creates support for the user object functions.
- Userpoints - a points-style module that doles out points based on rules provided by the administrator.
- Votingapi - builds the backend voting support that is extended by other modules like the fivestar module.
- Watchdog - handles the logging of errors and other declared actions to track on the site.
- Workflow_ng - allows customization of Drupal's built-in workflows.
- Xmlsitemap - creates a sitemap that conforms to the sitemaps.org specification.
- ExpressionEngine: PHP, commercial Content Management System
- Created by the same company that created CodeIgniter, a PHP MVC framework that I use heavily, I am quite comfortable using ExpressionEngine.
- I can extend ExpressionEngine using its Extensions, Plugins and Modules.
- Being that it's a commercial product, this system is well supported and has good documentation. Many open source projects are well supported and have good documentation as well, but many don't.
- I have used this for standard CMS implementations, as I like the flexibility it affords me.
- Joomla!: PHP, open source Content Management System and MVC Framework
- I can implement Joomla! as a basic CMS system, or deploy it in a way that produces a full-fledged, richly-featured site. I understand the way it operates, and can use its or the community's extensions, as well as create new ones from scratch.
- Here are a couple of examples of how I've used this system beyond basic CMS implementations:
- I've combined the built-in menu and banner modules to provide enhanced navigation options for the client.
- For a custom scheduling workflow, I provided front-end users of Joomla! the ability to show time of availability during a short period of time (two or three days) to other frontend users. Once logged-in, each front-end user is able to select time of availability from a personal page that shows a simplified personal agenda, as well as see a list of available users from a module published in the portal.
- WordPress: PHP CMS or Publishing Platform
- I am able to help you use this system for a simple blogging website, a simple business website, or as a full-fledged multi-blog business website. Wired, Yahoo!, the US Airforce, TechCrunch, Ben & Jerry's, the Wall Street Journal Magazine, and more respected and established companies use this system to drive their websites and/or blogs.
- I can implement any theme, plugin, or customization that's needed. Of course, it'll be easier if we select components that work well together from the start, but I can write new functionality to replicate or extend any features you wish.
- In terms of process, what I typically do for WordPress sites is start with the overall design. Following that, I decide on the content. Finally, I develop the theme and stylesheets to match the design, and structure it around the organization of the content. Lastly, I ensure that the content is easily maintainable and expandable. As I understand what WordPress is doing 'behind the scenes' (PHP and SQL expertise and deep system understanding), I am also able to quickly grasp WordPress's limitations, and look for alternative ways to accomplish a goal versus trying hard to find a plugin that will do the work and in a non-integrated fashion.
- I think the primary difference between people new to WordPress and ones that are gurus is the best practices. Using consistent styling, proper WordPress calls to determine context, and making the site as simple to maintain and update as possible is proper procedure. It is very easy with WordPress to just hack in changes as needed, but as those hacks accumulate, it can make quite a mess. Similarly, a clean separation of layout from appearance in the stylesheets is important when creating a theme. For a reusable theme, the two should be entirely separate so the styles can be updated to reflect a new color scheme or design without preventing maintenance updates from being applied to the theme and layout.
- I understand how to make WordPress sites SEO friendly.
- I am familiar with WordPress plugins, which allows me to help customers more efficiently by applying already-written plugins, versus creating them from scratch. I also know which plugins to avoid.
- I think, just like when choosing a project framework, WordPress is a great tool for specific jobs. At the same time, it has been used for many things that it is not good at, which frequently has resulted in migrations to other platforms or full custom site rewrites. I have learned a lot already about what WordPress is good at and what it isn't, and I think that understanding and unbiased perspective is important when planning a project. WordPress is a great blogging platform.
- MVC Experience: I would like to demonstrate my knowledge of this advanced pattern by describing how it works and how I've used it:
- This is a pattern for developing applications that makes use of reusable UI interfaces and object models. The controller glues the view and the model together by defining what parts of the model show up in the view. The view takes input, which goes through the controller for translation to the model.
- The model can then update the view through an observer pattern.
- Besides designing my own framework, I've used the CakePHP, CodeIgniter, Symfony, ZEND, and more PHP frameworks, which use this pattern. (My experience with each of these is presented in more detail in this online resume.) I hope you please read how I respond when people ask me if I have experience in tools I have not applied for customers yet.
- ORM Experience: I would like to demonstrate my knowledge of this advanced pattern by describing how it works and how I've used it:
- This is a technique that allows the translation between relational data structures and object data structures. Generally, you see this used when you have an object model system that defines your domain knowledge and you're storing the persistent data in a relational database. The two don't always map correctly so this layer provides translation.
- There are a number of packages that can do a lot of this automatically for you through some basic configuration, but the most complete solution is usually achieved by writing a custom ORM system for the specific domain problem faced.
- I've written a custom ORM between the UAR ABLE framework's model system and the datasources that track and query persistent data.
- CakePHP: open source PHP Framework
- I used a built-in active record system to enable order management and fulfillment processes.
- I developed a small, rich text controls helper, providing autocomplete and date picker functionality.
- CodeIgniter: open source PHP Framework
- I added CMS functionality and a drag-and-drop layout system within an application that uses CodeIgniter.
- I wrote a basic ActiveRecord base object that supports the pattern better than the built-in active record system.
- I developed a custom shopping cart using AJAX.
- I created authentication, SOAP transaction, newsletter, mailer, and message tracking system modules.
- I extended the core application model to integrate an application with a FileMaker database system.
- I created a system by which a single instance of a core set of libraries, models helpers, etc is shared between multiple websites.
- I created a reusable and configurable application to handle sealed bid auctions.
- For a major international brewing company, I used CodeIgniter to handle most of the page logic and presentation organization. Specifically, I used the FX.php library to connect CodeIgniter to the backend database, where most of the data for the site is stored. I used a dynamic FTP system to create temporary accounts on the fly for a more robust upload system that can handle files multiple gigabytes in size. I used a legacy database, this was a hard project requirement, to drive the system, which made it more of a challenging project.
- For the largest wholesale baker of cakes in the US, I used CodeIgniter to handle their specific business rule and presentation needs.
- Kohana: open source PHP Framework
- This framework, originally based on CodeIgniter, is a very clean PHP MVC Framework.
- I like this framework, and hope it does well. Given that it's a younger framework, I usually use it when it's requested. Community size, support, and longevity are important considerations in choosing a PHP framework.
- Symfony: open source PHP Framework
- I know the Symfony MVC structure.
- I have experience with third-party abstraction layers included in the Symfony framework, such as the "Criteria" and the "Propel" abstraction layers. Criteria uses parameters to create an SQL query, and the Propel uses raw SQL queries instead, for more complex or specific queries.
- I've integrated PHP and C++ document conversion libraries with Symfony to allow multiple types of documents to be combined into a single PDF download.
- Zend: open source PHP Framework
- A major project I was involved with used Zend to connect one customer with all of its customers so it could provide value-added services to them automatically. The system was developed so it could be applied to other sectors the primary customer serves with no retooling.
- I used Zend to create a delivery management system, including the front-end customer interface and a fully-functional back-end system for managing the business logic.
- I used components, including Zend_Forms; the Zend database tables ORM layer; and custom-written functional classes, for the model interaction.
- I tied in jQuery to provide rich, AJAX-driven features on the front-end side.
- Using a combination of jQuery and Zend, I created a robust geomatic services module to validate and geocode addresses in a restaurant delivery management system.
- I programmed a full-featured shopping cart system with support for multiple tax zones, special tax exemptions, dynamically-determined fees, digital and physical goods, and the ability to have multiple people participate in an order. All of these features integrated with Zend's database, controller, and view layers.
- I programmed a complex, dynamic fee system that allowed an administrator to specify rules that determined whether a particular fee, which could be either a flat fee or a percentage of the total order, would apply to a particular order. The rules could be based on the delivery location, the total order cost, the total number of items in the order, the item vendor, the location of the item vendor, the type of order, and the estimated time of delivery of the order. The system made use of Zend's automatic class loader to allow rapid development of the rules using a modular system.
- The shopping cart system allowed multiple users to add items to a single order, and allowed multiple users to pay for a single order. The master user was able to control how much the other users could spend, and was able to grant stipends to those users.
- I programmed an interface to validate a user's address by confirming the details of their address using MelissaData address verification and validation services.
- I used Google Maps mapping functionality to "show" the address the user was plotting, and display related restaurants close to their location.
- I programmed "radius" functionality that allows a user to define a certain search radius using their originating address as the center point. The Haversine formula was used to calculate a "zone" over a spherical area (the Earth) that corresponds to the radius designated by the user.
- E-commerce: related systems, carts, and more:
- I've worked with open source, hosted, and custom-built shopping carts.
- I've worked with payment and accounting interfaces.
- I've used Authorize.net, VeriSign's Payflow Pro API, Intuit's QuickBooks Interface, Paypal's APIs, and more in support of e-commerce financial and ordering transactions.
- I've used UPS WorldShip and USPS APIs for enhanced shipment processing.
- In addition to using CRE Loaded, Magento, and osCommerce (all described below in detail within this resume), I have used X-cart, Zen Cart, and many other commercial and open source solutions. Though it's written elsewhere in this resume, I think it useful to mention that I know systems, I know programming, and I've helped many companies implement and customize their e-commerce implementations. I can help you with any e-commerce implementation.
- E-commerce search and information access:
- I know Lucene/Solr, and can implement this open source, advanced search functionality to provide Google-like search results, with relevance percentages reported back to the user. This can be very useful for e-commerce implementations or for websites where there is a lot of data.
- I can use Endeca, a commercial, enterprise search tool to provide advanced search and information presentation capabilities. Example features I can implement: products can be presented based on availability; landing pages, category lists, navigation, labels, and more can be created dynamically; and intelligent searching enabled based on a dynamic dictionary generated and maintained by user-entered and administrator-entered data (allows for many presentations of data based on what the user meant to type; very helpful for commonly-misspelled products).
- I view e-commerce workflows as a subset of business workflows. There are two components in my opinion related to e-commerce:
- End-user presentation with calls to actions, generally to purchase or encourage more research internal to the site, and procedures to encourage more spending and loyalty.
- Back-office operations for allowing more to get done with fewer resources, and, in fact, encouraging and allowing end users to perform as much of these as possible.
- CRE Loaded: open source, PHP e-commerce system
- I can implement CRE Loaded, extend it, theme it, and help you use it for any purpose you wish.
- I have done detailed and extensive theming of CRE Loaded for the presentation layer of the system.
- I've created custom components to pull featured information from CRE Loaded for insertion into other parts of the website.
- Magento: open source e-commerce system
- Magento - Overview of Some of My Capabilities:
- I'm able to use Magento to accomplish any e-commerce business operational workflow you might want to accomplish.
- I know how to use Magento's native features to accomplish your specific needs. For example, I created one product in Magento to keep inventory for each size and color variation, while making it appear as one product. Using Configurable products with Attributes assigned to Attribute Sets, I created all the combinations of the product. This allowed inventory to be managed by each item type (Large Blue T-Shirt vs. Medium Blue T-Shirt, etc.).
- I have built a Magento site with multiple sites and storefronts tied into the same backend. Magento has this functionality built in; each site can have products from the "main" catalog, etc. The different storefronts or websites can exist with different URLs, security, and checkout methods. They can keep defaults from the parent installation, or use customized settings. They can pull all their attributes from the main site so you manage inventory, products, etc, through a single place, or this can be customized by storefront.
- I can manage upgrades seamlessly by extending Magento using best practices, thereby lowering support costs. I can modify code in a custom area of the code base, never touching or changing anything in the core. In this manner, upgrades are straight forward, and one does not have to support a patch list that needs to be applied each time one upgrades. The approach taken to accomplish this ease of maintenance depends on what the update does. There are ways to add the code to Magento that work outside of the main site so that they don't get affected; for example, to make a new payment type I created a new Payment Method that shows up in the admin page. This new method uses its own controller files, etc, and updates Magento through standard methods. Thus, if Magento was updated, it wouldn't affect the customization at all.
- Magento Customizations
- Implemented full-site templates, and performed Magento CMS integration with specialized designs from customers' designers.
- Created custom attributes for specialized products, and implemented into template designs.
- Integrated shopping cart item summaries into the template designs.
- Integrated security upload features for credit references into sites' customer accounts.
- Implemented special shipping rules and alternate shipment address recording for specialty items.
- Created special export features to take alternate shipping addresses and share them with 3rd party.
- Created new Magento payment method module that uses a merchant account API to perform real-time credit card processing.
- Implemented specialized Purchase Order payment method to allow site customers to request a PO with a custom PO number based on their credit references.
- Magento Integrations
- Created workflow so that the customer is able to easily manage their online orders in one step with one interface seamlessly integrated with QuickBooks.
- Integrated Magento with specialized T-HUB software for easy summary order management.
- Integrated Magento and T-HUB with QuickBooks accounting software for easy automated and manual updating of purchases to create QuickBooks Sales Receipts and customer information.
- Created custom workflows to allow Magento orders to flow to UPS's WorldShip for batch shipment and customer notification.
- Worked with customers to create workflow for Magento orders to allow shipment through QuickBooks.
- Used the standard Magento template format to implement design changes.
- Created all payment methods as Magento modules, and integrated into Magento in standardized formats.
- Magento - Overview of Some of My Capabilities:
- osCommerce: open source, PHP e-commerce system
- I can implement osCommerce, extend it, theme it, and help you use it for any purpose you wish.
- I have done detailed and extensive theming of osCommerce for the presentation layer of the system.
- I created a shipping module to provide international USPS support.
- Social Networking: please see the work I've outlined in my Interfaces section of my resume.
- Google Maps - here is some information about my Google Maps knowledge and application experience in general:
- Programmed an interface to validate a user's address by confirming the details of their address using MelissaData address verification and validation services.
- Used GoogleMaps mapping functionality to "show" the user the address they were plotting, and display related restaurants close to their location.
- Programmed "radius" functionality that would allow a user to define a certain search radius using their originating address as the center point. The Haversine formula was used to calculate a "zone" over a spherical area (the Earth) that corresponds to the radius designated by the user.
- Designed and implemented Google Maps into a vacation website.
- Created user interface to add properties, such as name, address, and zip code.
- Integrated Google Maps geocode function to convert address/zip code into longitude and latitude coordinates.
- Displayed locations on Google Maps using custom icons to convey the type of property.
- List of properties displayed outside of map was grouped with a map legend of property types.
- Created hyperlinks (with custom icon) outside of the map area that, once clicked, displayed property images and location details on the map, along with a hyperlink to the target website.
- Template Engines
- I prefer to program templates in pure PHP instead of using another "programming language" to program the template logic. However, I understand there is great value to be gained by using a template engine for some projects.
- I have used Smarty to develop a highly-dynamic website that places an emphasis on the proper separation of business logic and presentation logic. This separation made modifications to the site far easier for the users involved, and reduced the amount of time required to implement feature additions and changes for the users involved. It permitted the site to rapidly evolve as its visitors requested additional functionality. Smarty provided the site with a feature rich "plug and play" template system, while still providing scalability thanks to its built in caching system. It was a good solution for the project.
- I've used others beyond Smarty, and, given my focus on PHP and core programming fundamentals, I think I can use any PHP-based template engine if you think this is the right approach for your project.
- I have created custom widgets, widget management systems, and security systems to manage access to widgets. For the latter, I designed a system to communicate with Active Directory, which is a Microsoft technology for managing authentication in addition to other network services. Thus, clients only need to manage one set of users and permissions; that is, what is defined in terms of access and security for the internal network is propagated to the Intranet and Internet features as well.
- I think it's useful to provide my definition of this term. Technically, a widget could really be anything in terms of programming and the web. Most would state it's a small component that does a specific action or displays a specific piece of data. Often, it's deployable by non-developers with ease. To me, it's something that is either independent, or provides support to the main purpose of the currently-viewed page.
- Here are some examples of widgets:
- Drupal's block system is a good example of a widget. A block is a snippet of HTML that is either static or dynamically-generated. It usually displays some info, or provides access to additional features based on the page you're working with.
- A sign-on form for logging into an account on a website.
- The chat box that appears on the left-hand side of Google Apps and the iGoogle homepage.
- Here are some widgets I've implemented:
- Widgets for performing work and seeing data, including a cafeteria widget, a scheduling widget, and a quality-reporting widget.
- Widgets for administrators to change the look and feel of a web site using drag-and-drop functionality.
- A number of tools, including quick-add features, login features, navigation links, page actions, CRM search, language selection, etc.
- Mac and PC/Windows Server Experience
- I have programmed web services to ensure they work in Safari (though Safari usually handles compliancy well).
- I know Linux, which is based on Unix, and Mac O/S is based on BSD.
- I run an Apple Mac Pro as my primary desktop machine. It's a quad-core 2.9 GHz system with 8GB of RAM. It runs two NVIDIA cards that handle my four monitors. I like it because it provides all the power of the BSD command line while providing a nice, polished graphical interface. Best of both worlds.
- For my primary laptop, I use an Apple Macbook Pro. It's a Core 2 duo 2.8 GHz system with 8GB of RAM. It provides a good companion to the desktop, as I can use the same environment and applications for development on both machines.
- PC and Windows Server:
- I have programmed web services to ensure they work on the most popular PC-based web browsers.
- I've supported or managed the support of PCs and server environments since 1995.
- Prior to putting my focus on software development, I have done many Windows Server implementations. Examples of what I can do: Multi-site Active Directory, Group Policy with advanced .vbs and .bat logon scripts, DNS/DHCP, Distributed File System, Routing & Remote Access for VPN and WAN connectivity, Exchange Server, SharePoint Portal Server, and Internet Information Server. Having this knowledge really helps me connect my web services to Microsoft-driven services. For instance, I can have the authentication system of an Intranet or Internet site be driven entirely off of Active Directory.
- My Linux and Apache systems administration skills are advanced.
- I've managed Apache and sendmail processes since 2001 at Up and Running.
- I maintain a virtualized machine that hosts redundant firewalls, production, test, database, and staging machines.
- I use memcached, which "is a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load." (Source: http://www.danga.com/memcached/ )
- I have used apache mod_rewrite to protect a web accessible folder and modify the requested URL to call a wrapper script that can use a web application's security system to access the file. This is beneficial in that standard FTP and HTTP file operations on the webserver continue to work as defined, and are enforced by the web application.
- Most web applications I've written also use email communication, and I've written a set of routines in PHP to handle these tasks.
- Examples of services I've deployed:
- Asterisk solutions, including custom programming.
- I have designed a centralized HA Asterisk environment that will accept and authenticate calls from remote PBXs on the same VPN using SIP registrations. This HA solution utilizes Heartbeat (formerly Linux-HA), DRBD, and custom socket monitoring scripts for STONITH for failover between nodes. All remote PBXs register to this cluster, and all inbound and outbound traffic as defined in their dialplans is pushed via 120 SIP trunks from the service provider. This is a robust, scalable solution (in its current incarnation it can support ~20 remote nodes), and is ideal for rural environments.
- Multi-site Asterisk solution deployments.
- Unified messaging: the ability to capture many different forms of communication (fax, email, voicemails, SMS, etc), and deliver them to a single location, accessible by various devices, including computers, smart phones, phones, web accessible devices, etc.
- Voicemails can be emailed to one's inbox, and filed electronically.
- Extensions that allow you transfer calls to cell, home, and other phones, making it seamless for the caller.
- Custom menus for easy navigation for commonly-used features.
- Remote access to phone and messaging system over a secured internet connection.
- Custom software for call accounting and tracking for a billing system.
- Postfix/Sendmail services.
- POP3/IMAP mail servers.
- MySQL and PostgreSQL database servers.
- BIND master/slave DNS servers and replication.
- Samba file shares for cross-platform access.
- Samba Windows domain emulation.
- Set up commercially-signed certificates.
- Intrusion detection services.
- FTP/SSH services.
- VPN systems.
- IPSec tunnels.
- IPTable setups for complex router configurations.
- Version control solutions for programming or updated documentation projects.
- Open source backup solutions.
- Server monitoring tools.
- Workstation environments for office workers, programmers, and system administrators.
- VMware infrastructures that host redundant firewalls, production, test, database, and staging machines.
- Distributed and grid computing.
- Deployment of co-located servers for customers.
- Distributions I've used:
- Cent OS
- Red Hat
- Performance and Scalability Experience:
- I build performance and scalability into my systems because it's natural for me to do so. Best practices lend to a scalable and high-performance system, and these must be implemented and followed at all levels of a software development project: at the design and architecture level, at the functional (programming) level, within the database setup, within the systems administration configuration, and within the business processes themselves.
- I also know when performance and scalability design should be ignored. Of course, if the system is only used for a prototype or concept or for a small set of users, then the right amount of resources and best practices must be used so that value, as my client defines value, is maximized.
- To demonstrate my knowledge of scalability and performance measures and best practices, I'd like to include some specific examples:
- Cache when you can: Memcache is quite fast, and helpful in this respect. I've also used Memcache (and Memcachedb) as a store for common info like user accounts, profile data, etc. as it scales much better.
- One has to be mindful of the size of objects you cache in session as well. Course grain calls make sense to minimize DB resource consumption, but composite or grouped objects can consume substantial resources on high traffic sites, even those clustered and load balanced.
- Serve only dynamic pages in Apache: offload the static content to lighttpd+varnish or a CDN like Amazon S3 or Akamai. Contrary to popular belief, Apache+mod_php is usually faster than using a FastCGI implementation.
- Latency is key: one has to be very careful with web service calls and blocking SQL statements. Offload things like sending email, processing credit cards, etc. to background processes dedicated to this so you don't have Apache sessions hanging open doing nothing. They're expensive.
- Apache needs the correct number of client connections set, which is usually the amount of RAM available / resident size so you don't swap.
- Statically compile all modules you use (small gain), and remove all modules that you can (resident size is very important; many configs have all modules dynamically loaded via LoadModule, which doubles the size of Apache). This might result in your needing to double your capacity to handle connections.
- Sharding and partitioning: once you hit a certain point, it becomes very difficult to scale MySQL. It's important to logically partition/shard your data; with the 300m users I worked with on one project, the user database I developed was sharded into 8 physical MySQL clusters, each with a master and slave.
- For full-text search, Sphinx is blindingly fast, but it can also be used for fast lookups like email -> uid to stay off the MySQL servers. This is especially good if you have sharding; it's a great index telling you which partition to find a user/object/etc on.
- In PHP, there's plenty to avoid. Most common frameworks are not designed to deal with a large load, and templating systems are just attempts to reimplement PHP in PHP anyway (XSLT is especially bad). Avoid dynamically-loading classes, class_exists(), and relying on include paths - use a constant like MYLIBPATH and include all things relative to that.
- JSON (and serialized PHP if you can stick to one platform) is a lot faster for IPC than XML.
- Statistics tables versus counting/grouping dynamically: instead of counting how many products the customer has purchased each time, store that count, and update it when it changes. Keep triggers/stored procedures/etc out if at all possible.
- Avoid CURL calls and microtime any web service calls you depend on.
- Be mindful of the impact in the architectural phase of external dependencies: Google (especially Analytics), Amazon/A9, Akamai, and ad servers are notorious blockers with high average latency impacts.
- Autoloading class frameworks are critical in large PHP applications to avoid high procedural processing overheads. Also, only lazy load objects as needed.
- There is a wide variety of settings (maxconnections, requestsperconnection, filehandles, modules loaded, etc.) that can greatly impact the performance of an instance of Apache.
- Run EXPLAIN on each query over a certain time threshold.
- Design a normalized schema, and then break that normalization if needed to gain efficiency increases (normalization is a guideline, not a hard and fast rule).
- Seek low overhead on calls that are meant to be fast: AJAX server-side code, for example, should be extremely lightweight.
- Example applications of my performance and scalability knowledge:
- Description: I implemented the site layout, database structure, and the business logic for a Home Exchange (where two members stay in each other's homes for a vacation). The site has a comprehensive search feature that matches visitors who want to visit a particular location with visitors who own a property in that location. It features searching and filtering on many facets, including location, date of visit, duration of visit, as well as dozens of other tags and parameters. Visitors have the option of performing an initial search and then drilling down, or expanding their search criteria if they find too many or too few records within their initial search. In addition to the primary search run by the user, the system also performs "border" searches that find similar results by slightly modifying the parameters provided by a user.
- Database Size: The site uses multiple large database tables, including a 7 million record Geonames database and a large table of properties.
- Number of Users: The site has been designed to support hundreds of concurrent users and as many as 100,000 properties in almost 7 million different locations.
- Relation to Performance Optimization: The search functionality involves very intensive queries to the property and location databases in order to locate both direct and "border" results. In order to maximize the performance of the search functionality, I use multiple, heavily-indexed cache tables. These cache tables provide a very noticeable performance improvement over querying the data tables directly, and allow searches to be performed in seconds instead of minutes.
- Description: I worked on the user interface design (not graphics, but the processes for visitors to use the site), database design, administration features, shopping cart, member sign-up, API for partners, and the communication system (internal email combines with external email). Also, the job process for this client is extremely complex, allowing for milestones by job, deposits tied to the milestones, releasing funds at certain stages, managing the agreement between the parties in the job, maintaining the data files, and attributing the file with the right step in the process. Other features of the site I contributed to include a profile section, feedback section, and search. The database member search functionality permits an extensive filter selection, and these can be drilled down into or selected on the top level. Corresponding data is pulled according to the search criteria and the desired results. The search feature is the guest feature most often used.
- Database Size: 1.2 GiB; 6.7 million records.
- Number of Users: The site has 65 thousand registered members. On average, thousands visit daily.
- Relation to Performance Optimization: The home page utilizes some very SQL intensive functions that were taking up to 90 seconds to perform. I optimized the page, getting the search results to load in under 1 second. Furthermore, on the admin and internal parts of the site, I optimized the functions that interact with the database, both by changing the structure of the database and the server configuration, as well as the code for the search. The work minimized the return times on complex reporting, and allowed the site to function significantly better during peak times (when new job notices go out and everyone is logged in to submit their bids for them).
- Can't Name Company due to NDA:
- Description: Consistently a top 100 site in Alexa rankings. I used my best practices to contribute to their backend architecture in the same manner I would for any client.
- Database Size: I don't know, but they get over 30 million unique visitors/month.
- Number of Users: I measure users in millions of DAUs (daily active users).
- Relation to Performance Optimization: High relation.
- Systems Architect Experience
- I have been the lead Systems Architect at Up and Running for technology solutions since its beginning in 1995. I have served in this role for many Up and Running clients and for previous employers.
- I know both worlds. I have technical skills at the micro and macro levels, and I can move between specialist and generalist-level thinking quickly as needed. In summary, I can implement and architect, which I believe allows me to produce more in either area.
- I believe the ability to organize a system arrives after understanding the processes and components of that system, in this case the system that enables the development, deployment, and maintenance of software. There are the technical aspects (hardware and software), the process aspects (methodologies for software development and communication, systems architecture, managing people, managing projects, client interaction, and more), and finally and most importantly, the ability to assemble a good team and create the environment that enables and promotes success. All of these must be done while balancing scope, money, and resources. Each project offers its own challenges and rewards as each project requires its own mixture of these elements.
- I know how to research options for all aspects of a software project and present these options to stakeholders intelligently. I know that each stakeholder has his or her decision factors, and that it's important that they be able to assess options easily and quickly. I also understand that I should give my recommendation if it's applicable and state pros and cons of a particular decision as it relates to the software development teams' effectiveness.
Experience in using and interpreting web standards (browsers, accessibility, and validity)
- I develop according to W3C standards, and write code to enable browsers that do not always conform to W3C standards.
- I stick to the standards as much as possible and when I can't do that, I use industry wide/supported alternatives to achieve the functionality I'm after.
- I use transitional HTML 4.0 or transitional XHTML 1.0 doc types for my pages. This limits the occurrences of "quirks mode" being enabled, reducing most of the display discrepancies experienced between browser platforms.
- I also design my pages in a DIV/CSS style layout, making it very easy to present the page differently using alternate style sheets. This same design enables me to write for screen readers or brail readers just as easily. I can also format pages to display on handhelds.
- Graphics Design
- I have studied UI design, and have been applying it for years; I believe I've helped improve navigation and usability for many websites.
- I have basic graphics development skills (Adobe products & GIMP), though I prefer to seek design help for graphics, content and the more aesthetic aspects of website creation. I enjoy more and believe I contribute most to working on the engine of the software system.
- I do understand design in the sense that I know it's challenging, is complex, and requires the mastery of several arts, similar to software development. I have enough knowledge to communicate well with designers and graphics development teams. I have served as the software development contact for Design businesses and Communications departments. When our arts are combined, I think great things happen.
- SEO/SEM: I have working knowledge of this. However, to do this extremely well, depending on the site, this could easily be a full-time position in and of itself.
- Tools: These are the tools I use to organize work, and get work done faster. I've used many, and can adapt to what your preferences are.
- Version Control System or Source Configuration Management (SCM): I use Subversion (SVN) to manage my codebase. I also use Concurrent Versions System (CVS) for some of my customer projects.
- Collaborative Software: wikis, SharePoint, Google Sites, Basecamp, Exchange, and custom Intranets.
- Communication: email, VOIP on an internal Asterisk solution, Treo with Jawbone headset, and Pidgin with most IM accounts.
- Desktop Sharing: Ultra VNC and CrossLoop.
- Bug Tracking: Mantis and FogBugz. I have used Bugzilla, RT, and Flyspray.
- Project Management: spreadsheets (I believe Excel or Google Docs can accomplish most PM needs; people and processes are more important than the tool.), Microsoft Project, SharePoint, BaseCamp, and custom systems.
- Browser Testing: Firefox's Web Developer Toolbar and Firebug and IE's Web Developer Toolbar. I also run VMware on my Gentoo computer to QA systems on various browser versions: Windows XP Pro with IE7, Windows 2000 with IE6, Ubuntu with Opera and Konqueror, and another Gentoo environment for a clean development environment.
- Editors and/or Integrated Development Environments (IDE): Gvim/Vim, Eclipse, Visual Studio, and the Linux Command Line.
- Advanced Search Solutions:
- I've written a few full-text index search systems that index content information in MySQL and PostgreSQL. The most complicated search system I've written is within my custom framework; it can take a system object, use reflection to process its getter methods and child relationships to generate an index list, and store that in a generic search table. A system-level search then allows those object items to be pulled up off of keywords, and directs the user to correct views that render that object's data. It's fast, flexible, and allows for any model data to be searched for and displayed.
- I've implemented and customized Google Search appliances for customers.
- I know Lucene/Solr, and can implement this open source, advanced search functionality to provide Google-like search results, with relevance percentages reported back to the user. This can be very useful for e-commerce implementations or for websites where there is a lot of data. As an example, I implemented this for a job and candidate management site; the result was that they had far more transparency into their job and candidate data, which helped them and their end users accomplish their objectives faster and with more accuracy (better matching between job needs and candidate capabilities).
- I know Endeca, a commercial, enterprise search tool used to provide advanced search and information presentation capabilities. Example features I can implement: products can be presented based on availability; landing pages, category lists, navigation, labels, and more can be created dynamically; and intelligent searching enabled based on a dynamic dictionary generated and maintained by user-entered and administrator-entered data (allows for many presentations of data based on what the user meant to type; very helpful for commonly-misspelled products).
- Security Knowledge
- I've worked with highly-sensitive and secure materials, including financial data, healthcare data, and data formally classified as sensitive by the government and vendors who serve the government.
- I have run white hat security penetration testing for customers.
- I've rebuilt several compromised servers. (For the record, I didn't set them up.)
- I have read most of Kevin Mitnick's books, and have helped one customer organization develop its social engineering policies.
- I utilize open source products in my applications that are business friendly.
- I restrict work with GPL, OS 3.0 or other viral licenses to work that will comply with the business' objectives without compromising their intellectual property.
- I favor LGPL-like license terms as these permit the distribution of the software without the requirement that the intellectual property added around the licensed software be compromised or licensed under the open source license agreements.
- I provide recommendations and advice on the various open source licenses and the impact utilizing the software under these licenses will have on the project's IP rights.
- I strongly support proper software IP management for reduced liability and compliance throughout the project.
- Technologies that I'm not an expert at and that I'm often asked about: Here's how I usually answer when asked if I know a tool based on programming languages I know: understanding the primary underlying technologies (PHP & SQL, for example) is the key. My learning curve is more of a flat line at this point in my career when it comes to using most tools. Another way to present this is: I have theory and experience across many tools, languages, and processes that I can apply regardless of the new widget, tool, or methodology. I'm not claiming to be an expert at everything, rather a highly-adaptable professional when it comes to any tool related to web services.
Other Relevant Information
- Usability: I subscribe to Jakob Nielson's Alertbox, and have studied user interface design. My primary concerns are usability and flexibility when creating a UI. I have read these books so that I can work better with copywriters and designers, and design better myself:
- "The Design of Everyday Things" Amazon link
- "The Inmates Are Running the Asylum" Amazon link
- "Homepage Usability: 50 Websites Deconstructed" (by Jakob Nielson) Amazon link
- "Designing Interfaces: Patterns for Effective Interaction Design" Amazon link
- "About Face 3: The Essentials of Interaction Design" Amazon link
- "Observing the User Experience: A Practitioner's Guide to User Research" Amazon link
- "The Design of Sites: Patterns for Creating Winning Web Sites (2nd Edition)" Amazon link
- "Waiting for Your Cat to Bark?: Persuading Customers When They Ignore Marketing" Amazon link
- "Call to Action: Secret Formulas to Improve Online Results" Amazon link
- "Persuasive Online Copywriting: How to Take Your Words to the Bank" Amazon link
- Agile Development
- Up and Running, the company I founded, believes in the Agile methodology for development and deployment of software because of its focus on the customer and the customer's feedback.
- I've used more standard forms of development life cycles, such as the waterfall methodology. I recognize the importance of following the customer's preferred means of doing work, and am able to adapt to any software development methodology.
- I believe this methodology is responsible for Up and Running being able to deliver products that customers use and like.
- Due to the high levels of customer and user interaction I incorporate within my projects, my systems are well received. I believe in user-focused, interface-driven software development because if the system is not usable, it will not be used in most cases.
- I believe in using a test process that involves all stakeholders: primary programmers, peer programmers, quality assurance specialists, project managers, customers, and, most importantly, the user.
- I believe developers should use these tools and methods to test their work: Peer Reviews, Unit Testing, Automatic Build Testing, Test Cases, User Story Confirmations, User Interface and Navigation Checklists, and Development Completion Checklists.
- I think project managers and quality assurance specialists should use these tools and methods to check a developer's work: Test Cases, User Story Confirmations, and User Interface and Navigation Checklists.
- I use tracer bullet development (Hunt, Andrew and David Thomas. The Pragmatic Programmer: From Journeyman to Master. Addison Wesley, 1999.) on larger scale systems to retrieve faster feedback from customers on UI designs and system workflows. Amazon link
- Besides the book mentioned above, I have read these books on the subject:
- "Agile Retrospectives: Making Good Teams Great" Amazon link
- "Practices of an Agile Developer: Working in the Real World" Amazon link
- "Release It!: Design and Deploy Production-Ready Software" (Not directly related to Agile development, but it's applicable.) Amazon link
- "Ship it! A Practical Guide to Successful Software Projects" (Not directly related to Agile development, but it's applicable.) Amazon link
- Besides the above, I have read books on estimation, managing software developers, and the requirements gathering process.
- I have helped grow Up and Running from a single person in 1995 to an organization that that has 60+ employees, and serves customers across the world.
- I recognize that leadership is setting the direction, and that management is ensuring that direction is fulfilled efficiently.
- I know the relationship between Vision, Mission, Values, and Strategic Goals.
- At the start of software projects, I like to ensure that the vision and mission of the project are in direct alignment with the organization's vision and mission.
- I think it's important that people and projects have their own organization-focused vision, mission, and goals.
- I have read books by Jim Collins, Peter Drucker, Stephen Covey, and Tom Peters on leadership and management topics.
- I believe a manager needs to set the stage for success, and do whatever is needed to help team members achieve success.
- I have learned how to assess potential team members, as well as ways to quickly learn if someone is capable.
- I have hired and fired people; though I don't enjoy the latter at all, I view it as a responsibility if the person is not improving after being given the opportunity to do so once given objective, constructive feedback.
- I have led, coached, and mentored other team members, and enjoy learning from my team members, my team lead, and all other peers.
- I have read materials on how Microsoft ("How Would You Move Mount Fuji?" ( Amazon link )) and Google (online) hire, and have created two interviews to test for developer aptitude.
- I've written template job descriptions and responsibilities for organization webmasters.
- The Agile books I've read help me to be a better manager operationally.
- Team Work
- The foundation of a project's success is its people and the relationship between those people. It's important for the team members to have a shared goal, the tools to do their job, the knowledge to do their job, and respect and trust for one another.
- I have been working with customer teams since 1995 to deliver technical solutions.
- I have experience working with remote contractors and developers using various tools to manage projects, time, and collaboration.
- I have led, coached, and mentored other team members, and enjoy learning from my team members, my team lead, and all other peers.
- I am one of the owners in a company with the other owners living in Michigan and California; I'm used to working remotely, and can deliver results doing so.
- Interpersonal and Oral/written Communication Skills: I hope the letters of recommendation attest to my abilities in these areas. English is my primary language.
- Analytical Abilities: It's hard for me to demonstrate these in writing, but I'll attempt to. I have taken personality type tests before for previous employers, and those always result in labeling me an ENTJ. I think it's mostly accurate. "The[y] are assertive, innovative, long-range thinkers with an excellent ability to translate theories and possibilities into solid plans of action." http://www.personalitypage.com/ENTJ.html (I think I've addressed the potential weaknesses of this personality type through awareness.)
- Customer Focus
- I work closely with the client stakeholder team to understand requirements, system specifications, and design. This is standard operating procedure, and something I believe is very important for the success of a project.
- For our requirements gathering sessions, I generally approach them using a workflow-based framework as defined in this document, "Up and Running -- Workflow Analysis Introduction.pdf" . This is part of our overall solution design methodology, as defined in, "Up and Running -- Solution Design Methodology.pdf" .
- I also maintain the perspective that it's my responsibility to ensure the system does what the end users want. I don't believe it's easy to define requirements, and this is why the Agile programming methodology is so appealing to me; it allows the customer to see how the system is progressing and to offer feedback at every iteration. The end result is a very nice product because it does what the users want and how they want it, meaning that the system will actually get used and not sit on a shelf.
- Business and Technical Communications:
My degree in Management of Information Systems gives me a unique perspective in that I understand business operations and software development operations. This allows me to bridge the two worlds well, meaning I'm very helpful at translating end user or business line requirements into functional or software development requirements. In other words, I can talk business and "geek". Examples:
- Since 1995, I've worked with several hundred clients across the nation, helping them translate business needs into technical or functional requirements, depending on the type of technology solution needed.
- At one client's, I wrote and implemented an entire Manufacturing ERP to manage their manufacturing processes.
- At another, I implemented a system to lend more transparency to their project workflows in addition to streamlining payroll and customer invoicing processes.
- At another, I developed software to improve the quality of product delivery throughout all post-order operations management.
Some Personal Information
- Short History
- I grew up in Hancock, MI, which is in the Upper Peninsula (U.P.) of Michigan. It's known for its snow, beautiful scenery , and yoopers (wiki).
- I met and married my lovely wife, Kate Hanson — an Alaskan who went south to the U.P. for school, and she brought me to Missouri soon after so she could pursue her career as a teacher and be closer to family. We lived in Webb City, MO for about 7 years, and I didn't miss the snow the entire time.
- Erik Odin Hanson joined the family on 4/29/08 at 8:05am.
- Alora Rose Hanson was born on 12/28/09 at 9:12 am.
- My brother lives in Arizona, and the rest of my immediate family still lives in the U.P.
- As of June 2011, we live in Ames, IA because it is close to family and friends. If you like corn and a great community, Ames, IA is a wonderful place to be. (I can travel for work.)
- I think I'd be remiss if I didn't explain a little about my first piece of hardware I used a great deal and the first software program I wrote:
- First piece of hardware: This was a 486SX 33 MHz with 4 Megs of ram. It ran DOS 6, and didn't have Windows. I had a 14,400 modem as well, which made browsing the BBS' in the area nice and fast. With that, I could download a 200K file in about 3 minutes. For the first two years of my computing experience, I just used a DOS environment. I was a teenager when I got this machine, and it was near top of the line then.
- First software program: I suppose this would be a batch file that used decision logic and a menu structure. The neighborhood kids would come over to play games on the 486SX computer described above. Since they didn't know DOS commands, they would constantly ask me to start a new game for them. That got tiring so I wrote a batch file that would present a menu of games that they could play. After a selection was made, it would modify any system parameters needed to play the game, and launch the application. Saved me a lot of time. : )
- Woodworking and, in general, fixing things.
- Cooking and experimenting in the kitchen.
- Playing card games, board games, RTS games, first-person shooters, and puzzle games.
- Working with and experimenting with computers and software, mainly in open source technologies.
- Reading, mainly fiction, but also computer manuals and information on new technologies or subject matter on the projects I'm working on.
- My friends call me "Smiling Pete".
- I work with people throughout the country with my 4 monitors, and 80 inches of diagonal viewing area run by my Apple Mac Pro. (Scott Adams, author of Dilbert, states in one of his books, "An engineer who is surrounded by machines is never lonely and never judged by appearance. These are friends.")
- I use an IBM Model M Keyboard. : ) (wiki)
- I own nearly every Dilbert book.
- I have a Black Belt in Tae Kwon Do, and currently actively practice Tai Chi.
- I have two children, and recently traded in my Jeep Wrangler for a minivan. Please, no jokes.
I would be honored to be able to work with you to accomplish your web-based goals. If you have questions or would like to talk about anything, I hope you'll please call me at anytime (Cell: 906-281-1178). Thank you for taking the time to read about the opportunities I've been given to help others and the technologies learned along the way. I hope I'll be given the chance to prove myself to you.
Software should yield returns and be accepted by the end users, and I believe
the recipe for success starts first with people, process next, and technology last.
I'd be pleased to help you navigate this complexity.
the recipe for success starts first with people, process next, and technology last.
I'd be pleased to help you navigate this complexity.