We have experience across a broad range of technologies and can work comfortably in many computer languages and problem domains.
PHP, Go, W3C
We usually opt for PHP and build on top of the FuelPHP framework and our own extensions to it. This allows us to leverage the performance and flexibility of this open-source stack. However, we have also delivered projects using different frameworks such as Symfony and other technologies such as Go and NodeJS, all depending on our client's requirements.
Not all web applications are truly dynamic and many serve up highly cacheable content. We can exploit this fact to build optimized, high-performance systems. 1
PrestaShop, Shopify, WordPress
We have built eCommerce sites using some of the most popular frameworks and platforms, including:
Each one has its strengths, and all have their limitations and problems. This is especially true for plug-ins. When problems are encountered, we are usually able to find solutions, work-arounds, or even implement fixes directly in the code, in order to achieve the client's goals.
PrestaShop was chosen by one client who wanted to move from a proprietary, homegrown system to an open-source one. The implementation activated advanced features, like multi-warehouse inventory management. Ming Fu also built a complementary web application to implement back-office reporting and invoicing workflows specified by the client's Warehouse and Finance departments.
Shopify is a popular hosted eCommerce platform. We implemented a site that became the archetype for the client's other regional store fronts. Our solution leveraged Shopify's basic "collections" and metadata functionality to make a highly data-driven and self-organizing catalog of products that looks great on phone, tablet, and desktop screens.
WordPress, a popular open-source content-management system, is actively developed and counts a significant installed base and developer community. For some clients and use-cases, WordPress can be a viable platform on which to build solutions. Our experience with WordPress spans the range from simple brochure web sites to multilingual corporate web sites to WooCommerce sites to fully-fledged, complex applications for clubs and hotels.
It is worth stating that using a framework is not a necessity, and in some cases we have simply designed and built our own solutions. 2 The choice to "build your own" or "adopt a solution" depends on the problem at hand and on the client's requirements and overall objectives.
PHP, Go, Java
We usually build web services in PHP, Go, or Java, depending on larger considerations for how the service will be used. In some cases, we work on systems employing a mix of these technologies.
For PHP, the REST web service is usually a component built into a larger web application.
For Go, we have had good success writing microservices both for our clients and for Ming Fu's own needs. Go has very good performance and scales nicely. 3
Java is another good choice for building web services, owing to its performance and availability of high-quality software libraries. Modern frameworks like Spring Boot have removed the friction and drudgery that made the early days of Java EE so cumbersome and tiring and have allowed Java to compete with Ruby and PHP for rapid development. Ming Fu supports a number of clients whose systems are built on Java and Spring Boot.
Objective-C, Swift, Java, C
Most of our projects on iOS and Android have been for large, data-driven systems employing a backend cloud service. In these systems, the mobile app provides a rich user interface, and it usually has some sort of storage and interactive capability when off-line.
Our projects spanned four main areas:
Each project was significant in size and effort, and our customers committed both technical and budgetary resources to build them. Mobile application development is a world unto itself and much more involved in terms of design, development, and cost than most prospective customers understand.
On the surface, mobile app development requires a sharp focus on aesthetic detail and mapping out a clear and functional user experience across a range of screen sizes. Design and Experience are the key words, and they are different and complementary concepts.
Internally, the same challenges encountered in designing performant and maintainable systems for server and desktop software are amplified on the resource and power-constrained mobile device. Despite running on small screens, mobile apps are no less large in their complexity as their server-side and desktop cousins.
iOS and Android apps are built using the application frameworks supplied by Apple and Google, and the prevalence of sample code and open-source frameworks clearly can help advance a project. And yet, a survey of code snippets on the Internet reveals how easy it is to write "spaghetti code" that contravenes good software engineering practices and that stumbles over itself as functionality is added.
In fact, on a number of occasions, our clients have hired us to "clean up" or "reset" a failed app development project. To do this, we methodically and prudently refactor troubled code, step by step excising broken pieces and introducing layering, subsystems, and data structures. Over time the interior of the app is completely renovated.
There is considerable gratification in rescuing projects like this, but is it not better to avoid the situation from the outset.
Go, C, Python
Considerable value can be gained by leveraging off-the-shelf development boards such as Beaglebone and Raspberry Pi. Loaded with a Linux kernel, the boards offer a familiar programming environment and facilitate rapid prototyping of solutions that, for example, marry "traditional" web applications with on-device sensors and real-time controls.
For ARM/Linux boards, our preference is to design solutions using Go, though other languages are natural fits too, including C and Python.
Here are a few examples of products and prototypes built by Ming Fu:
We deploy our own services on a mix of FreeBSD and OpenSolaris and support numerous Linux systems for our clients.
The nature of Cloud Computing platforms and competitive markets encourages diversity in deployments. Our clients are deployed across Alibaba Cloud, Amazon Web Services, Google Cloud, Joyent, and SoftLayer. Each platform has its own idiosyncrasies, especially concerning management and provisioning, and its own mix of service offerings.
In some cases, we utilize multiple platforms to mitigate risks of failure at any one. For example, for one client, we built and maintain a business-continuity process involving two data centers, in Taiwan and the United States, and continuous database replication and data synchronization between them.
In the early days at Ming Fu, we maintained multi-tier, high-availability application-server clusters for a startup in San Francisco, for whom we also developed the front-end iOS and Android applications.
For off-site backups, Rsync.net provides a straightforward, block-storage file system built on top of the venerable ZFS file system. Amazon S3 and solutions built on it are also viable and economical. The choice of which system and approach to use depends on the problem at hand, the client's requirements, and budget.
In addition to deploying and managing SQL databases, web servers, and the standard mix of software packages, Ming Fu operates and sells its own e-mail messaging (IMAP, POP, SMTP) service, built on top of the carrier-grade CommunigatePro platform, and hosting service built on top of FreeBSD and PHP7. Get in touch if you would like to use our fully managed service.
Finally, Ming Fu's engineers are collectively driven to build performant and secure systems up and down the whole stack from the user interface to the backend server.
A pretty user interface fails when it cannot load quickly and efficiently, and a backend becomes a liability when it cannot operate at a steady state or when it does not have consistent, predictable scaling factors.
Likewise, security is a complex, multi-faceted problem which must be considered from the outset of a project. Security is also a capability about which superlative or definitive statements are to be avoided—a system is secure until some unforeseen weakness is exploited. The folly of arrogance and complacency must be avoided in matters of security.
We employ standard practices in protecting the network, application, and system layers. These practices include requiring TLS 1.2 or higher for secure networking, sanitizing and validating all inputs submitted to the server, writing clean and tested code, and hardening the operating system environment.
We adjust these practices and augment them as needed. For example, we have had demonstrable success in designing security solutions for distributed systems running in insecure environments, using such protocols as OAuth and HAWK and building an escrow service for sharing sensitive data between systems.
Our job is to engineer systems that our clients can maintain and build on. In our engineering practices, performance and security are equally fundamental considerations as the implementation technologies.
A case in point: when a client us to build a sports web site, we decided to write a static-site generator in Go that consumed XML feeds and other data sources and rendered news pages organized by specific topics. As content was published only twice daily, the site itself was essentially static and highly cacheable. A modestly sized server could deliver high volumes, with "hot" pages naturally pegged in the virtual file system's memory. The solution was lightweight and cost effective. ↩︎
This was the case for a magazine publisher in the United States for whom we built a clean, mobile-friendly subscription ordering system. ↩︎
For example, we used Go to built a web service "proxy" that, sitting between the mobile app and the origin server, selectively mixed in new functionality for certain versions and users of the app. This system was deployed to a major Australian telco to service an iOS app. ↩︎