Welcome Intern, Rick Button

This week has been exciting for us a The GForge Group.  We’re wrapping up work on GForge AS v6.2.1 and have broken ground on v6.3.0.  However, more exciting news that we’ve hired our first ever intern, Rick Button.

Rick is a freshman at Purdue University.  I can’t begin to tell you how surprised we were to find a candidate as qualified as Rick with less than a year of college under his belt.  He’s always been a geek, having dove into problem solving and programming at a very young age which made the decision to work on his computer science degree a no-brainer.  When we bring on new talent, we make it very clear we are after problem solvers, willing to work a variety of technologies towards a solution. Rick has already picked up Java, PHP, Ruby on Rails and has just started giving Rust a test spin.  In fact, Rick’s obsession with technology spills over into his free time where he likes to learn how to build decentralized systems and he admits to surfing osdev.org more than is probably healthy.

He is only 4 days into his new role with us but he loves being able to work while attending college and (thankfully) loves the chat feature in GForge which has allowed us to hook him up with our entire support and engineering teams.  Based on the number of support tickets he has fielded and the handful of commits he has already made, we’re sure he’ll be making some great contributions.

Finally, we’d be remiss without giving a special shout-out to Mark Zieg.  Mark, though not a customer, has been following our blog and we found Rick when Mark posted the internship opening on Reddit.  Thanks, Mark…that gesture was tremendously humbling!

Work on GForge v6.3.0 Started

As I write this we are putting the finishing touches on GForge Advanced Server v6.2.1.  I’ll share a few of the things you can expect from that release in a separate post, however, I wanted to share our plans for v6.3.0 which our engineering team started on today.

Like any software shop, we take support very seriously.  Our ability to help  customers iron out any issues and to get the most out of GForge is closely linked with our success and while we have done a lot to improve the initial quality of each GForge release (as noted in Quality Improvements on Untestable Code) we haven’t improved our support system.  We decided this growing problem  had to be addressed and to do this we not only wanted to improve how we deliver the best support possible, we wanted to provide our customers the same support tools we use as part of their GForge projects.  For this to happen, we will have to change a few things.

We are currently using an open source product that we’ve customized over the years to provide support.  This product is missing a number of key features like the ability to search existing tickets, the ability to send out reminders to tickets waiting for customer feedback or the ability to send email reminders to our support team on open tickets still requiring action.  As we thought about how to solve these problems, it didn’t take long for us to realize that with a few tweaks, GForge’s Tracker feature could do all of this.  With that said I wanted to share the key features of the support system we are implementing inside of GForge:

  1. Support tickets should be able to be opened by simply sending an email to (e.g.support@gforge.com).  
  2. New and existing support tickets with attachments should have the files tied to the ticket.
  3. Customers should be able to access, search and update any of their tickets .
  4. Customers inside the same organization should be able to access, search and update any tickets tied to their organization.
  5. Customer should be able to respond to tickets by simply replying to the support updates sent from GForge.
  6. Customers should receive email updates when one of their tickets is updated by our support team.
  7. Our support team should receive email updates when a ticket is updated by a customer.
  8. Customers should receive regular updates on tickets awaiting feedback from them.
  9. Support engineers should receive regular updates on tickets awaiting their action.
  10. When a ticket waiting on feedback from a customer reaches a configured age, the system should email the user letting them know if nothing is done the ticket will be closed.

Not only do we want to provide our customers these features, we want to expose these updates to all GForge projects so our customers can take advantage of them on their own projects.  And this is just the start of what we have planned or GForge v6.3.0.  Once the support implementation is done, we will be using it as our primary support tool from gforge.com and begin working on some other initiatives, most notably the addition of a new REST API.

While the existing SOAP API in GForge has served us well, it has proven fragile, frustrating for our customers and it limits our ability to bring bigger and better updates in the future.  The GForge REST API will scratch a few key itches for us:

  1. Our REST API will, for the first time, include a complete test suite allowing us to ensure as we improve GForge that we are aren’t breaking anything.
  2. The REST API will allow us to give GForge a much needed user interface overhaul.
  3. Integrating other tools with GForge will be easier for customers who use REST instead of SOAP.

This is an exciting time for our team because soon we will be able to give customers better support and with the REST API we will finally have the foundation needed to bring some significant features to GForge in the future.  If any of you have any questions or comment please feel free to post it here or to send an email to feedback@gforgegroup.com

 

Join The GForge Group As An Intern!

GForge Group is looking for a part-time college intern to provide first and second-level technical support to our customers.  Come and join a world-class company that supports thousands of project teams around the world.  

What we’re looking for:

  1. Work from home 12-20 hours per week, Monday through Friday.  Initial term will be through the end of the spring semester with an option to be extended through the summer.
  2. We’re pretty flexible on schedule, as long as the results are right.
  3. A moderate amount of knowledge in Linux/Web systems administration.  Stuff like:
    • Linux basics (ps, grep/find, sed/awk, top, iostat, etc.)
    • Package mgmt (e.g., yum, apt-get, rpm, etc.)
    • Scripting (bash, php)
    • Apache httpd setup and config (conf files, modules, etc)
    • Version control tools like CVS, SVN, Git.
    • Bonus points for SQL and Postgres!
  4. Programming experience preferred (PHP, Python)
  5. Great customer service attitude.  Especially when they might have done it to themselves.
  6. Last and most important: willingness to learn a lot of cool stuff, and share what you know every day.

Responsibilities of the Job:

  1. Make customers really happy by fixing their problems.
  2. Research issues that don’t have an easy answer.
  3. Willingness to dig into code to possibly give a better bug report to our engineering team.
  4. Work from wherever you like, but be productive and respond quickly during working hours.
  5. Lean on other GForge staff and share knowledge whenever possible.
  6. Stay in the loop – email is a given.  We also camp out together in chat all day and have an informal daily standup, usually on Google Hangouts.
  7. Document solutions that can be re-used.
  8. Depending on how busy things are, we may even ask you to help test out new features and bug fixtures.

This sounds amazing!  Where do I sign?

Whoa, hang on tiger.  Send us a note at intern@gforgegroup.com.  Include stuff like your name.  Make sure we’ll understand how awesome you are.  We will interview you and a few other people (just to make it look fair), and go from there.

On the Importance of the Team

This week, our City School District handed down an unpopular decision – to close a charter-type middle school. I have a friend whose son attends the school, and they both spent a lot of time and energy trying to change the School Board’s minds about the closure. I was very impressed with their effort but in the end, I’m not sure if anyone was really listening.

After hearing the news that the school would be closed, the thing my friend lamented first and foremost was not the uncertain prospect of another school, or a different level of challenge for her son. It was the loss of the community the school had become.

The opposite could be said of my old job with the State. I was in charge of a group of developers (among other things), and gave it as much thought and effort as I had. We delivered a lot of great things, on many tight timelines, and I often felt it was the best place for me to contribute to the world. But after eight years, I realized that the community around me was never going to be as good as I thought it needed to be. Over a long weekend, I made up my mind to leave. I was gone about a month later.

I could write many other examples from my personal experience or that of my close friends. Examples where someone sticks it out in a tough situation, or leaves an easy, high-paying job for something more difficult and less rewarding. The theme that emerges in each case is the same.

Your team is the most important asset you have.

That’s right – your disruptive product, synergistic partnerships, business model, funding stream, delivery process and technical wizardry are all secondary in importance to your team. That huge idea you’re out there making noise about? It’s very probable that someone else is already doing it, too. With more funding, six months ahead of you, and with a much trendier technology stack. Or a better corporate partner. GForge is a good example of some of these disadvantages – tools like Github and Jira are much better known and flashier-looking.

So how do you compete? If you have all that buzzword-y stuff I listed above and a bunch of superstar strangers delivering it, you simply aren’t set up to get where you want to go. No, you need to get the best (nicest, most dedicated and OF COURSE talented) people you can find, fit them together carefully, give them space and boundaries.

All of the other goals you have – making good decisions, making up for bad ones, staying late to do it right, knocking it out of the park for a big customer – all of these things flow from the team.

Fix your team. Make sure everyone belongs, and make sure they know it.

This is exactly what Tony’s been doing since he took over at GForge. It’s definitely working for us:

  • We delivered more new features in the six-month 6.2 cycle than in the previous two years.
  • Everyone on the team contributes to planning, new development, and support.
  • We all know who to lean on for Unix-y OS stuff, versus Javascript-y stuff, versus REST/SOAP/API kinda stuff.
  • All code is reviewed. Everything else (documents, mockups, plans, ideas) is at least shared out as we’re working on it.

This is the best overall team I’ve ever been part of, and that is Really Saying Something. We are definitely our biggest asset, and we are doing great things every day together. Those disadvantages I mentioned before? We’re adding more features on a weekly basis, and gaining new customers every month.

I’ll write more about our roadmap another time, soon.  Until then, let’s hear about your team. Changes, successes, problems? Leave a comment!

Screencast: GForge Advanced Server’s Chat

The recent release of GForge Advanced Server v6.2.0 now support chat.  Learn why we felt we had to add chat and how your teams can get the most out of it:

Quality Improvements on Untestable Code

Introduction

I bought The GForge Group just over 18 months ago and it didn’t take long before I realized the codebase for GForge Advanced Server (AS) was woefully out-of-date, and impossible to test.  Inheriting code in need of some TLC wasn’t anything new to me – but back in my consulting days I was usually able to justify the need to rewrite a system, or I would decide to leave the code alone doing as few updates as required.  Our customers want to see improvements in our product and its initial quality and, for the sanity of our engineering team, we needed to innovate while iterating quicker.  Putting our customer needs first (and that of our company), we had to eliminate any talk about a from-scratch rewrite. The end game is that our code needs to get a testable state including the use of not only phpUnit and Selenium but also Jenkins to fully automate our build process.  The bottom line is we had to find ways to incrementally improve our code quality over time.

Where Things Were

Before I talk about our first iteration toward better quality, I want to clearly state the challenges we had with the old codebase.

  • Code Diversity – I’m sure this probably isn’t an industry term but when I say code diversity I’m talking about the fact our codebase had, and still has, code based on the PHP4-style of doing things combined with newer PHP5 object-oriented code.  This intermingling of old and new code meant implementing new features quickly was nearly impossible.
  • Dependency Issues – The dependency chain in our product makes it nearly impossible to isolate code in a way that can be unit tested.
  • Codebase Size – Because GForge AS packs a lot of features, it comes at the cost of a lot of lines of code.  This makes the code diversity and dependency issues exponentially worse.
  • Small Team – And as if we didn’t have enough challenges, our team has never had more than 4 engineers working on all the GForge AS code at any one time.  This means manually testing all that code is damn near impossible to do well and when you factor in that our engineers also manage customer support making time management an issue.
  • Subversion – In my prior lives I used CVS and Subversion.  When I started, GForge AS was still in Subversion and the frequent, untested commits combined with a weak SCM workflow meant our updates often introduced new bugs.
  • Thirst for Innovation – If you combine everything above and add in the problem we have to continually improve GForge AS, we had to make a choice.  We can either implement new features in the same old, slow, broken way we have done things or gut significant parts of the system so that we can iterate faster and so the new features have the kind of quality we are after.

The first release I oversaw was v6.0, and it was pretty much done when I bought the company.  I took the prior owner’s way of preparing that release as-is, which means I spent a lot of time testing code in a series of virtual machines.  With v6.2.0 I got to oversee the my first full release  and while I loved seeing some new ideas we had come to life, we still followed the old, broken, untestable development process.  We quickly learned one person can’t test all the code and, to be honest, with all my responsibilities as the owner of the company I probably wasn’t the one that should have been doing it.  As you might have guessed, this meant that both v6.0 and v6.1 had bug fix releases that quickly followed them to address many of the bugs we didn’t find during testing.

Where We Want To Be

The end game is pretty simple.  We want the GForge AS codebase to have as much test coverage as possible via both phpUnit and Selenium so that we can reliably have code commits kick off all the tests and, if they pass, then deploy the code to gforge.com.  This process should be fully automated and allow us to do code deploys multiples times per day if desired.  We also want to have the proper choke point(s) in place to ensure code reviews are happening so that we know that not only the code works but is written as well as possible.

Taking The First Steps

The challenge for our team started with first admitting that we can’t get from where we were to where we need to be overnight.  So over the course of the release planning for v6.2.0 we had to find some good first steps towards iterating faster while improving the code quality.  We found 4 quick ways to do this in fairly short order

  • Migrating to Git
  • Perform Focused Functional Testing
  • Introduce Code Reviews
  • Roll code to gforge.com nightly

Migrating to Git

Many people probably wouldn’t consider migrating from Subversion to Git a tangible way to improve code quality, however, the gains in quality we got by changing to Git weren’t so much a function of switching to Git, rather, the workflow we put in place after we migrated.  Like many shops, under Subversion our branches were reserved mainly for prototyping, bigger features we wanted and for customizations we made for some of our customers.  With Git we still had all those needs but we then began creating branches for every single tracker item in our project.  This means that each bugfix, enhancement, etc gets its own branch in our Git repository which isolated code changes from any other changes.  While the number of branches we had in flight grew exponentially, it meant we could finally perform focused functional testing and isolate the code changes involved in a bug fix so we could introduce code reviews to our process.

Admittedly our Git workflow isn’t new or unique but I want explain how our SCM workflow improves code quality.  As I write this, we have just launched v6.2.0 and release planning for both a v6.2.1 and a v6.3.0 has already started.  Our master Git branch represents the stable v6.2.0 release.  We have another branch called gforge-next which now represents v6.2.1 and one more branch called rest-api that will eventually add a full REST API to GForge AS in our v6.3.0 release.

All the work for v6.2.1 is being branched off of the gforge-next branch. So, for example, if we have a tracker item (e.g. bug #2442) that represents a defect, the engineer assigned to fixing that will create a branch called something like 2442-some-short-description.  Once the fix is made by the engineer and the code is pushed he will set the status on the tracker item to “Needs FT” (FT stands for Functional Test). All tracker items we have in a “Needs FT” status will then kick off a workflow to ensure that someone tests the fix and reviews the code.  Assuming the test and code review confirm the fix and that the code is in good shape the 2442-some-short-description branch will be merged back into gforge-next.

Focused Functional Testing

Because we are a small shop, I like to keep the engineers working on the code so I have assumed responsibility for performing a functional test on most tracker items in the “Needs FT” status.  I only test ‘most’ of the fixes because if I know a bug fix is trivial I often skip the functional test and proceed right to the code review.

To perform my functional tests I have a virtual machine with a script I wrote that will install any branch from our Git repository.  So, continuing with our example, I will then install the 2442-some-short-description branch, do any data setup needed, and then I will verify the code addresses the bug or feature.  If the test fails, I send the tracker item back to the developer, otherwise I’ll confirm the fix by setting the tracker item to our “Needs Merge” status.

Incorporating Code Reviews

The first code review I ever did was back in 1994 when I was working at Rockwell Collins.  In hindsight it was a bit ridiculous including tons of paper none of which were annotated in any useful way which made finding the actual code changes impossible without guidance from the engineer conducting the review.  Though painful by today’s standards, I immediately appreciated the value of code reviews not only for code quality but also as a learning tool where I’d get schooled by more senior team members.

Fast forward to today.  Once our tracker items are in the “Needs Merge” status, this indicates to all the other team members that someone should checkout the branch, review the code and, if the code looks good, merge it back into parent branch.  To facilitate this we created a simple client side bash script that does all the “magic” needed to produce a diff using Git.  This in turns fires up the locally configured GUI diff tool so the engineer can quickly review the code.  Once done reviewing the code, the script will ask if the engineer would like to merge it back to the parent branch and, if so, the script does the rest.  Once the code is merged, the bug is then move to the “Fixed (test for release)” status.

Nightly Code Rolls to gforge.com

Perhaps one of the biggest changes we made to our process is rolling the integrated code in our gforge-next branch out to gforge.com.  It is important to note that all the previously discussed improvements had to happen before nightly code rolls to gforge.com were feasible.  That’s because we use GForge AS to build GForge AS so we needed some certainty that what gets deployed is relatively stable.  The other obvious benefit to this approach is we, by doing our daily work, give most parts of GForge AS a good workout allowing us to address any further issues ahead of a release.

Right now the nightly code rolls are done manually and, when done, our team will take all the tracker items in the “Fixed (test for release)” status and do another verification that the bug fix or enhancement is working as expected.  From there they go into our “Fixed (closed)” status.  That’s the same status we then use to produce our change log prior to a release.

Recap

In the spirit of giving you all “real talk”, I know none of the improvements I’ve discussed are new or revolutionary.  In fact, there was some internal discussion amongst our engineers that maybe I was airing too much of our dirty laundry.  Maybe.  However I think there are a lot of companies and open source projects struggling with the same challenges we are facing and I feel there needs to be an ongoing dialog about how to improve the quality of large, legacy systems.  So let’s keep this dialog going. What are some things you or your organization have done to improve large, long running systems?

GForge v6.2.0: Live Discussions, Improved Tracker Queries and More

Today, GForge Advanced Server delivers Live Discussions, Improved Tracker Queries and more.  Here is a quick run-down of what’s new.

Get GForge Advanced Server v6.2.0 now!

Live Discussions

Live Discussions gives product managers a pulse on the their projects while giving teams a great way to collaborate but, most of all, chat makes collaboration fun!  Don’t let the familiar “chat” user interface fool you.  Live Discussions are fully integrated into GForge:

  • See Project Activity – As bugs and other tasks are added or changed, the updates are streamed to your live discussion room.  Similarly you will be notified of new source code commits, updated documents, wiki entries and other project activity.
  • Social – Invite users to a live discussion or get their attention by simply using @ mentions (e.g. @janedoe).  We also support @ mentions in tracker items and all your notifications will appear in the new Notification Center.
  • Completely Searchable – All live discussion messages are searchable which allows you to find those important nuggets of information from prior discussions.
  • Discuss anything – Live discussions can happen at the project level or on just about anything in your project including bugs, tasks, documents, wiki entries and more.  These discussions are then forever linked with the artifact being discussed.
  • Autolink – Type in [#XXXX] or the full URL and a summary of that bug or task will appear in the live discussion.
  • Embedded Content – Paste in the URL to an image or YouTube video and the content will appear in the live discussion.
  • Drag-n-Drop – We provide HTML5 drag-n-drop support.  To share a new document, just drag it from your desktop into the chat window.
  • Sounds – We ship stock sounds but you can upload your own sounds for use in your project’s live discussions.
  • Email Integration – If you monitor a live discussion to receive email updates from a live discussion, you can continue the conversation by simply hitting “reply” with your email client.
  • Security – Not only do we leverage the powerful GForge Access Controls, we (optionally) pump all external links through Google’s Safe Browsing API to prevent phishing or the spread of viruses.

Improved Tracker Queries

We’ve updated Trackers to make finding and reporting on bugs and task simpler:

  • Pre-defined Queries – We’ve updated the predefined queries in GForge to include “Recently Modified”, “Closed”, “Open”, “Unassigned” and “My Open Items”.
  • Tracker Browsing – When browsing Trackers you can now filter using “Any User”, “Any Open Status” and “Any Closed Status”.
  • Relative Date Support – Run reports on Trackers to include things have change since “last friday” or that are due “tomorrow”.  You can still use explicit dates but no doubt you’ll appreciate the new expressive control you get.  Additionally, you can test all relative date queries with our Date Criteria Tester.

Numerous Bug Fixes

Really at the heart of v6.2.0 you have a significant bug fix release with the features above.  We’ve implemented so many bug fixes that we can’t cover them here but you can get the exhaustive ChangeLog.  That said, we recommend all v6.1.2 customers to upgrade immediately.

Download GForge Advanced Server v6.2.0 now!

What to Expect from GForge Advanced Server v6.2.0

Last week we were able to release GForge Advanced Server (AS) v6.1.1 which was a bug fix release and we’ve already got a jump on development of GForge AS 6.2.0.  One thing we want to make clear is our engineering team is focusing on key huge initiatives simultaneously.  The first is v6.2.0 which we will cover in more detail in a bit but the other is the addition of a REST API.  The REST API is a vital component for the future of GForge AS because it will not only allow our customers easier and tighter integrations between GForge AS and 3rd party systems (e.g. CRM, ERP, etc) it will serve as the basis for a ground-up refresh of the user interface.  We should point out that we will eventually deprecate the existing SOAP API in favor of REST but we will give customers plenty of notice before that is official.  That said, here is what we have cooking for v6.2.0

  • Addition for web-based Chat support.  This is meant to provide a full blown replacement for things like IRC, IM where project related conversations are lost.  With the new chat implementation your chat history will be not only retained but searchable.  Also you can start chat session from many places within GForge (e.g. Tracker Items).  The Chat implementation uses extends the existing forum plugin so you get the same level of access control.
  • Forum plugin rebranded as “Discussions”.  This is more semantic than anything but it is meant to really make it clear the new plugin is a much more powerful collaboration tool than the old forum implementation.
  • Better email support for discussions.  Currently you have to used specially crafted email responses to reply to a discussion in the current forum plugin.  Going forward you can reply to forum posts and chats by simply hitting “reply” in your email client.
  • Ability to clone external Git repository during project creation.
  • Addition of pre-defined tracker queries for things like “Recently Modified”, “My Open Items”, “Unassigned Items”, etc.
  • Support for user-based SCM repositories.  This will provide user’s a place to safely store versioned code that, for whatever reason, may not be ready to be included in its own GForge AS project.
  • Ability to mass-move tracker items from a tracker in one project to a tracker of another project.  Right now this can be done one tracker item a time so this update will make moving large number of tracker items easy.
  • Ability to monitor a folder in Docman.  Right now you can only monitor a file.

GForge Advanced Server v6.1.1 Released

We are happy to announce the immediate availability of GForge Advanced Server v6.1.1.  Thought this is nothing more than a bugfix release, we are encouraging all customers on 6.1.0 to upgrade because it fixes a number of issues related to the revamp document manager.  Many of the fixes are focused on fixes browser specific issues in Docman and with adding back in some regressed functionality (e.g. renaming a file, editing the description, editing version change descriptions, etc).  Here is the full set of changes:

[#3717] Tracker browse page – assignee filter field should include all past assignees too
[#6988] Fix ordering of DB mod scripts for GF6.0 to be after 5.7.2 release
[#7405] When the project summary page is set to display only NEWS, the page layout is wrong
[#8129] Make Avatar image size smaller and add option to turn off avatars completely (sitewide)
[#8335] Add ability to see who has downloaded a document and when (using audit tables)
[#8362] Integrate the docman file upload widget mario developed to other plugins (missing on Wiki only in 6.0)
[#8442] On SCM->Admin page change option for SSH vs DAV to be SSH or HTTP(S)
[#8451] After creating a new account, login as site admin, new user account info still shows
[#8483] URL Encode breadcrumb URL’s and the link icon and file/folder names in docman
[#8512] Add additional “Add New Tracker Item” on browse page to top of table.
[#8602] Docman: Add ability to link to specific files and display that file in the panel
[#8604] The “Home” icon doesnt work when you are in search mode (Docman)
[#8947] Project Approval – Vulnerable to concurrent approvals
[#9023] Unable to post to message wall.
[#9024] Issue when adding removing files and folders
[#9025] Adding a new folder does not appear at all unless I check the box public folder.
[#9026] Notification of docman changes had bad link…it used old docman URL format
[#9027] Unable to upload a file in Firefox (some version)
[#9033] Tracker browse page’s data grid needs to use text for priority not number
[#9034] “Uncaught ReferenceError: Ajax is not defined” when clicking on the “Select stock avatar” popup in My settings
[#9050] In IE users can’t delete folders or rename them.
[#9056] Change “Files” in GForge menu to “Releases” because “Files” and “Docs” in the same menu confuses users
[#9058] Implement feature to rename files in docman
[#9059] The user blog plugin still uses the old FCKEditor
[#9061] Fix problem when deleting remote branch (Git)
[#9063] When leaving empty the list of enabled workflow transition scripts for a given transition, the changes are not saved
[#9064] Allow users to chnage the description and change fields in Docman

Customer Git Repository of v6.1.0 for GForge Advanced Server Customers.

We’re happy to announce that it will be easier than ever for customers who have customized their own GForge AS instance to keep their changes in sync with our current stable branch.  To do this we have created a Git repository for customers that we sync each night with our lastest stable release.  This means that customers will be able to clone the repository, apply their changes this first time, and then going forward do merges with our repository as we release new versions.  If you are interested in getting Git access please just head on over to our support site and submit a ticket and we’ll work on getting you setup.

Follow

Get every new post delivered to your Inbox.

Join 885 other followers