Skip to main content

Surface Pro 3 - Windows like Ubuntu

I had the great fortune of being sent to OSCON by my employer (we're hiring!) this year.  On top of getting to hear from lots of like-minded developers and learning about technology I might not have otherwise considered, I also managed to score some loot!  The most notable of which being a Surface Pro 3 which I had been coveting since their release, but had lost interest due to very steep prices.

Getting it was actually an interesting process that I was perfectly okay with playing into because we're all at OSCON to have fun and learn.
Being their main source of revenue, it's important that Microsoft fend off the impression that Windows is developer unfriendly.  So, the overall gist of Microsoft's booth at OSCON this year was to remind people that you can in fact develop using free and open source tools on Windows, a non-unix.  (Curiously, I have been saying since the 90s that FOSS would be the norm and Microsoft's 180 on it of late is just more writing on the wall.)

To avoid any confusion, I'll spare everyone the risk of thinking I've lost my way:  If you're using a machine that can support having it installed, Ubuntu is still the best platform for FOSS based development - even better than OSX.  Without getting to the extortionate cost of Apple hardware, the tools on Ubuntu are abundant and all the resources are in place to ensure that you're not struggling to get them installed.  If Ubuntu ever comes to feature as strong a suite of software and integration for the Surface Pro 3 & pen, I'd probably end up switching it over.

That all being said, because I like the Metro-style interface, OneNote and stunning battery life, I'm perfectly okay trying to use Windows on my Surface Pro 3. Variety, right?

Expectations

It's important that I still be able to do all the things I'm used to in Ubuntu.  This means I need to be able to run the glut of development tools I'm interested in at any given moment, natively.  No contrived virtual machine setups and complicated internal networks with host filesystem bridges and permission issues.  I need to be able to type php, node or scala and get direct access to the tools.

Because Windows doesn't ship with any kind of package management and because chocolatey is not ready for prime time yet, vendors don't have a clean way to centralize distribution and updates.  This makes it very difficult to access open source packages the way you would on Ubuntu which is usually just a matter of calling apt-get with the occasional PPA having to be added.
On most flavours of Linux, the packages are fully integrated into your system: Configuration, home directories, paths, alternative management and extensions - it's all going to be somewhere consistent.

Windows doesn't have this wired up as nicely as Ubuntu or even Homebrew on OSX.  So there's no real way to get the nice level of integration I listed above.  But so long as I can run the tools, I'll live with having to manually manage them because for the most part - I don't have to or only have to do it once.

Installing Web Platforms

Most people setting up PHP on a Windows or OSX machine will end up reaching for things like MAMP which are like the thermonuclear option. The integration is somewhat haphazard and while I applaud their efforts, I don't feel like it's going with the flow.
So I dug a bit deeper and ended up discovering the very poorly promoted Microsoft Web Platform Installer.  Inside it had builds of PHP all the way up to current versions of 5.5 and because it comes from Microsoft seems like a reliable canonical packaging. For Ubuntu readers, think of it like as if someone wrote a front end to apt, but only for web platform packages.

If there's one tool out of my whole experience that I could say merits much more discussion, it would be this.  I feel like would be a very interesting starting point for a kind of "Microsoft FOSS portal".  Not just for web platforms, but for databases, caching servers, libraries, web platform extensions/modules, and much more.  It's actually thanks to this tool that I didn't abandon many of my efforts!

Console

Scott Hanselman has already spoken about it, but if you're looking to do anything in the console, go and install ConEmu right away.  Be patient with the utterly overwhelming configuration options.

You will get everything you've wanted in a terminal on Windows including a dynamically resizable session and always-on text highlighting with copy/paste from keyboard shortcuts.

Something that I did play around with in the past was installing cygwin and having ConEmu fire up a bash session.  There are a few things that don't always go perfectly from within a cygwin environment, but it was neat to feel like I was back in Linux.  For the sake of keeping the system clean, I've chosen not to use it on my Surface.

While you're at it, go ahead and install msysgit.  It is the git implementation you are looking for.

Pretty Things

Part of using Windows is of course the eye candy of the 8.1 desktop. You may not be a fan of Metro and prefer your ye olde start menu junk drawer.  But when I saw the Windows 8 interface for the first time, it was refreshing and novel.  As a side note, if you've ever worked with Microsoft's push notifications, they're kind of fun in terms of what kind of functionality they make available as a baseline.

There are a few good apps in the app store, but what's obviously missing is anything google-related. They've seemingly decided to skip the Windows 8 ecosystem (for now?) - but that doesn't mean you're left without recourse.  So go ahead and install Chrome like you normally would, except if you haven't already, start adding apps via the Chrome Store.

I'm particularly fond of Postman REST Client, Google Play Music and of course Gmail.  The trick however is to then go to the view that lists all the large icons for your apps and do this:
Create a shortcut for Chrome apps!

That will pin them to your taskbar and give them their own context to run in, which really kinda blends in all the features of ChromeOS into your Windows install.  No more pinning and juggling your "always on tabs".  Your browser just goes back to being a browser.  You can also enable the Chrome launcher if for some reason you think it's worthwhile.
(I should also remark that when you're in Ubuntu, if you go to the web interface for OneNote, you can pin it as an app to your taskbar.)

Okay, some of these have been pretty obvious, but I think people forget that you can combine all this functionality together on Windows.  So for someone like me who has every reason to want to enjoy a Surface tablet without having to circumvent it, I actually can!

IDEs and Viewers

Unless you're developing Microsoft stuff, JetBrains makes the IDE you want.  However be sure to install Sublime so that you're not wrestling with line endings when editing configs and viewing logs.

Robomongo, Redis Desktop Manager and MySQL Workbench come highly recommended and are also available for Ubuntu and OSX.  I would not be caught dead without those tools.
(For those of you on Ubuntu, I also recommend trying them out with GSTM which allows you to easily set up tunnels to your live servers.)

Also, do check out SourceTree.  It's available for OSX, but is arguably more integral on Windows.  The visuals are also a great way to get a firmer grasp on the git terminology and what it all actually means.

Other Stuff

So, I've really only spoken about web platforms and some Chrome integrations, but what about Java, Scala, MongoDB, node.js, redis, MySQL and other tools?  Well, believe it or not, they're all pretty well handled by the respective vendors.  The trick is similar to what I did when trying to get a sane PHP install for my IDEs to recognize: Look for an official Microsoft build of the project, then MSI, then EXE, and then if all else fails get an archive of the statically built software and create a directory in Program Files for it. This is the case for redis and MongoDB where I feel like they could be making things a bit easier on Windows.

However this is also where that Microsoft Web Platform Installer or some equivalent could come to the rescue.  In those circumstances, Microsoft has every reason to step in and integrate a build of the project with the operating system, further cementing their commitment to FOSS on Windows.

Conclusion

So, am I doing development on my Surface Pro 3 in such a fashion that I have established on my other two Ubuntu-running laptops?
I think only just as of today, yes, I am.  It's taken a bit of figuring out after being away from Windows as a main programming driver for such a long time.  But I have been able to use PHP's built in server to host Laravel and connect to my machine's MongoDB database and everything appears to be working.  I was able to install grunt, bower and stylus to download and build my static front end git submodule.  Which is a pretty good litmus test considering all the moving parts in there (git submodules, node, npm, PHP MongoDB .dll and php.ini config).

Would I consider developing on Windows to be superior to developing on Ubuntu?  As I stated earlier: No.  While I don't have that Windows-is-unnatural feeling anymore - like as if everything is abstracted - I feel like it took a lot of manual effort and configuration just to get everything in place.  Part of why I wrote this blog post is so that I would have somewhere to come back to if I ever had to do it again!

That said, I do have a very nice Haswell Dell XPS 15 with a QHD+ touch screen running Ubuntu with me and I haven't thrown my hands up and switched over yet.  Not to prove a point either, my Surface Pro is growing on me like an accessory might.  Not just as a tablet/ultrabook hybrid, but as an entire package.  Battery life, switching from tablet to ultrabook mode, visuals, that personal feeling... Yeah, I know, it's weird - I don't think any of the enthusiasm Panos Panay had for this device during it's launch was insincere.

So, in closing - I remain totally confident that if Microsoft took the price down $200 - $300 (the higher up you go) across the board and included the keyboards, these things would flood the streets.  There is just too much untapped appeal for them not to succeed.

The Surface Pro 3 has lots of different micro-personalities that reveal themselves to you as you use it.  As an always-on developer, this actually has resulted in increased productivity for me!

Comments

Popular posts from this blog

Laravel Project Architecture: The Missing Guide

At my job, we've been doing a lot of learning and development using Taylor Otwell 's Laravel 4 PHP framework.  As we've become more familiar with it, we've had to come up with better ways to structure our projects outside of what the documentation indicates and the default distribution that is provided. If you've been working with Laravel 4 for any amount of time or come with experience from another framework and are just getting started, you've probably noticed that there are a lot of different ways to cut up your projects. Choice is nice, but sometimes it can be paralysing or misleading. Concrete Advice This post is done in such a way that you can just skim the headings, but if you want a detailed explanation in each section, feel free to read in where necessary. While I can't say the entirety of my advice is in practice throughout the community, I can say that we are starting to use it, and to very good effect at my job.  Especially consider...

Building .NET Core Nuget Packages

My last blog post was on building and publishing npm packages, specifically for typescript projects. In my opinion, packages are an important fundamental unit in software development. They sit at the confluence of technical competence and collaboration, and represent something the software community should be proud of. Most of the time, you're going to be creating software packages once you're comfortable with some essential pillars: Coding Project structure Software architecture Building Delivery Community Licensing After I got my npm package up and running, my next task was to do the same thing with my C# libraries. Similar to protoculture, I have made a library called praxis .  This is done by leveraging the services and tooling known in the .NET ecosystem as nuget. In this case, praxis abstracts many of the concepts and functionality I require when producing server projects. It builds on top of ASP.NET Core, so in that sense you can almost think of it as ...

Laravel is Good, Facades Aren't

I've been working on some Laravel 4 based packages lately which inevitably results in me also looking at other packages. I've noticed sometimes that people use facades at times that give me pause. The most troubling being from inside their model classes. A quick google turned up this video which assures people "there's still an instance behind everything, we're fine" .  Everything mentioned in the video is true except that there is a very glaring omission. Scope What usually goes out the door at the start of a long series of mishaps in software design is scope . When the desire to obtain a solution is stronger than the desire to consider the implications of a firm approach, mistakes are sure to follow.  Sacrifices like this are made due to the assumption of a high cost to developing carefully. What really is happening however is a false dilemma , being responded to with a convenience decision . It's very easy to write model code like ...