Designers are actually psychologists who can draw.
http://shar.es/DUC4t

gracie abrams

oozey mess
official daine visual archive

Product Placement
Keni
occasionally subtle

Jar Jar Binks Fan Club
Cosmic Funnies
cherry valley forever
Cookie Run:Kingdom Official!
TMBGareOK. The Official They Might Be Giants tumblr
★

PR's Tumblrdome
"I'm Dorothy Gale from Kansas"

if i look back, i am lost

Origami Around
taylor price
Interview Vampire Daily
art blog(derogatory)

@theartofmadeline

seen from United States

seen from Italy

seen from Spain
seen from Argentina

seen from Brazil
seen from United Kingdom
seen from Malaysia

seen from Malaysia
seen from Uruguay

seen from France

seen from Mexico
seen from United Kingdom
seen from Poland

seen from Switzerland

seen from United Kingdom
seen from United States
seen from Ukraine
seen from India
seen from Russia
seen from United States
@whos-v-blog
Designers are actually psychologists who can draw.
http://shar.es/DUC4t
Bitcasa's risky bet
Bitcasa just announced that they secured another $11m in funding and kudos to them for that.
Because the way I see it, they are making a big bet. And its not unlimited storage frankly or anything like that. Its consumer bandwidth.
They are optimistic that consumers will have the bandwidth to upload megabytes and terabytes of data. Otherwise Dropbox et al are just fine.
And this in my opinion is a tricky one. I for one am not quite optimistic. It will happen - fiber and what not everywhere, but its a political battle between the ISP's, internet backbones and companies like bitcasa.
I am all up for everything in the cloud, but the perfect product for me won't be something that offers unlimited storage. Its quite the contrary.
I want stupid, no-nonsense access to my data including -
Organizing
Search
Works on all devices seamlessly
Provides local sync'ing of partial content of my infinite drive
My infinite drive data can be portioned across many computers as not all computers need the same set of data for bigger families and small businesses
Deep OS integration. Think Time Machine. Dropbox will do as well, but I want better integration.
Security at my finger tips. Ability to delete and destroy my data in seconds at will. Including rules for data access after my demise.
Last but not the least, everybody should be able to use its basic functionality without watching any tutorials.
Oh, a nice to have would be-
Supports fast hot-linking so I can link my drive data online. This one has to be fast. Ideally CDN fast.
I admit, this is quite a bit and its hard. But someone out there will crack it... eventually. The time has to be right. Right place, right time as always.
PS. I signed up for bitcasa but simply couldn't use it, because the upload speeds just won't allow me to upload my photos and music from my laptop. I don't own a desktop.
The longer you wait for the future the shorter it will be.
Loesje
In the end all you need is just your imagination.
Vishal Shah (2013)
Apple/Google/Microsoft/Nokia/?? - Want to #own #mobile?
You need many many small wins to own mobile today. It is a very mature & demanding market.
But I think, there are 5 things that truly stand out. And they IMHO set the path for success and loving users everywhere.
1. Form Factor Design & Aesthetics
Just say no to Naysayers. Design matters. Actually it's not the design itself, but the way it makes you feel when you hold and use the device. A mobile device is deeply personal and for many something that they will hold for hours during the day. Its become a constant - it's almost always with you, these days even at night. Hence, if you can offer some customization features, that will just seal the deal, building a strong bond between the phone and the end user. Take inspiration from musicians, designers, architects on this one.
You probably spend more hours with your phone than your darling wife or sweetheart. Yes, its true.
2. Camera
A high-quality camera system (hardware & software) is an absolute must. By that I mean a high-quality lens, focus and image stabilization system, which is especially good at low-light conditions. Mediocore low-light photos will just blow your device. Think what & who you are designing for. Someone who would like to pull his/her camera anytime to take a shot - night or day, indoors or outdoors. The camera should just work.
And these days sophisticated camera software algorithms for everything from stabilization to editing and applying filters are equally important as the lens itself.
3. Apps - Dev SDKs & Love
Apps, apps, apps. I need apps. And for that you need to attract developers. And for that you need to express the deepest appreciation and support to developers. Listen to them. Build good feedback and bug reporting systems. Hold conferences through out the year. Reach every corner of the world where there is a potential for developers. Elect dev community leaders, sponsor meetups and events. And listen if not anything else. Build that feedback loop. Hiring more dev evangelists and technical writers will seriously help you out your opponents.
One mistake SDK designers make is that they think developers need every single feature exposed or available in the SDK. Wrong. We need just the right hooks at the right place to build and extend the OS. The open source community is great - they will take it from there. Sometimes developers will prefer open source frameworks and extensions over closed propietary ones.
Finally, in my opinion, a good chunk of the SDK must be open-source. Good software architects can isolate propietry closed extensions to open source SDK's helping achieve the best of both worlds. Developers need better access to the SDK and elevate their level of understanding and open-sourcing helps and shows your commitment as well.
4. Cloud
Users are lazy. They hate connecting their devices to computers for saving, backup, sharing, etc. That's a FAIL unfortunately. Users also want to switch devices and expect things to just work. All their data is there as they left it. Furthermore, they want to share & collaborate with friends, family and colleagues.
And this applies to all things data today - music, vidoes, app state, game saves, email, calendar, to-do lists, planners, etc etc.
Furthermore, try not to restrict your cloud access to mobile. They should be able to access it from anywhere. I know that's a big lofty statement. But sorry, that's the state of affairs today. Don't lock users out from my own data! There is nothing more frustrating for users than that.
A sub-optimal cloud infrastructure will seriously put you back. I can not emphasize this more. Without a robust cloud architecture and infrastructure, you are putting your users up to no good. When they lose their phones or switch devices or share stuff, they will have to look at custom solutions seriously impacting your relationship with them. The minute they find a device that solves it, they will be thinking to jump-ship.
Last but not the least, building upon cloud data and offering users valuable content services is the next big thing. And Google Now is the prime example. Not only does it leverage cloud data and presents you in an interesting way, it also extracts meanigful and valuable data out of it often by predicting and recommending things. Data science has gone a long way since a decade ago and the power of computing we have access to, makes meaningful netflix-like predictions and recommendations on other daily things a reality.
5. X-Factor
Put your fav thing here .Because I don't have one. I reserve this for the device designers and who they work for. Whatever you stand for. Whatever sets you apart. Whatever differentiates you from the rest. Whatever you at the end of the day believe in.
You have to infuse what you stand for and believe in, in the products you make. This defines you and helps users connect with you. It's that human thing that at the end of the day will unknowingly steal the show. This is that X-factor.
V
@goldenv
Good design is as little design as possible
Dieter Rams
By failing to prepare, you are preparing for failure
Benjamin Franklin
The World Until Yesterday - Gates, Diamond Commentary
Referring to the book - The World Until Yesterday: What Can We Learn from Traditional Societies?
BILL GATES: You have a section in the book on what you call constructive paranoia. It’s interesting how a lot of people worry a lot about certain bad things happening to them that are very remote possibilities, and they don’t think much at all about everyday dangers that can add up to significant risk. You talk about how New Guineans are smarter about calculating risk and how you apply that approach in your own life.>
JARED DIAMOND: I personally have gotten much more careful about taking showers. I realize people say, “Jared, that’s ridiculous. Your chances of falling in the shower are one in one thousand.” Yes, they may be one in one thousand, but then do the math. I’m 75. Statistically I’m expected to live to 90. If I take a shower every day, that’s 5,475 showers. If I reduce my risk to one in a thousand, that means I’m going to kill myself five and a half times before I reach my life expectancy at age 90. >
And so I worry that taking a shower is the most dangerous thing I’ll do today. I also stood on a stepladder, the second most dangerous thing that I’ll do today.
Link
Book in reference
iOS 7 is More Than Just a Pretty UI
WWDC 2013
I am one of the 5000+ developers at this years WWDC and as expected the craziness here is through the roof. Long lines, information overload, not working but getting more tired than working, and just the developers from every part of the world - their emotions and excitement, its quite an experience to say the least.
iOS 7
And like most expected iOS 7 took center stage and really is the reason why most of us are here. Sure there is Mavericks (OS X) and iCloud and all that, but nothing comes close to the energy surrounding iOS 7.
My Phone - It's Personal
The world is going increasingly mobile and among other things that make mobile important, there is one reason what makes mobile truly special and its why I am in this business - its personal. Its the one thing with you all the time, for many even in their beds. For newer dads like me, its one of our children's fav toys and learning tools. And for the entertainment seekers, its the one thing that truly delivers each time, every time.
Now, lets talk about iOS 7 and why its a defining moment in Apple's history. You know iOS is special when you non tech-savvy friends and family want to know more about this "iOS.
Looks
In case you have been in a cave until now, here's what iOS 7 looks like -
Flat UI - Is it really all flat?.
One of the first things folks notice is the rather flat UI. And the color palette - its more colorful, playful if you will. The entire user interface looks more efficient & crisp, is what you'll say if you really are a design geek. It is flat in the sense that the UI does not give you an impression of it being more like a real-world thing - skeuomorphism - is what people refer to such things.
iOS 7 was conceived according to Johnny Ive (Apple's chief Designer) to be a new direction for iOS and a new beginning.
And trust me, Johnny had more than just a Flat UI in mind. It's true, that the "base UI" of iOS 7 is indeed very flat. The icons, the default controls, the content is all laid flat.
But across all these different elements, lies something very fundamental and that in my opinion truly defines iOS 7.
Emphasize the Content using Full Screen
One of the reasons you need to flatten your UI is to simplify the OS UI so that you can emphasize on the content. A heavy, saturated, glossy texture-rich OS UI can really take away the focus of the user from the content. Clearly Johnny and Apple designers realized this was the case.
Hence, you will find some of the most unobtrusive OS UI ever in iOS 7. In fact its so unobtrusive, sometimes you can't even tell the OS chrome from the content itself. And just like Mac OS X, iOS 7 now has a deep emphasis on full-screen.
Full screen apps, are next big thing now. Games have always been full-screen but now apps, are encouraged to go full screen and put the limelight on the content - be in text, images, videos or all at the same time.
For example, check out the safari app below -
On the left side, you will find Safari's web view. There are a few things to notice22 here - 1. The content clearly is the centerpiece and the focus. Everything else is carefully sort-of tucked away. In fact when you start scrolling the web content, the menu bar at the bottom simply disappears! Before you know it, you are gazing at the content you care the most. 2. Notice the translucent menu bar. It serves to be both unobtrusive while at the same time reminds you of the context it's placed above, your content. 3. We will talk about Depth & Layers more below, but notice the menu bar clearly gives the sense that it sits above the content. This seemingly uninteresting point makes iOS7 a masterpiece of design. Depth and layers just like in a 3-d movie can add tremendous vitality, as some say, into the UX.
Layers, Depth & Translucency
As apps get more and more complicated, its important to keep the UX simple & accessible yet make sure we are not limiting the app's capabilities.
Layers provide developers to overlay content over content to give users a sense of what they are seeing and what else exists around it.
But, how do you give users a sense of depth? One word - translucency.
Translucency help provide a sense of context by uncovering parts of the content below, giving users an indication of the both sense and depth.
Translucency is everywhere in iOS 7. For example, check out the iOS 7 control center below -
By stacking up content in layers, and selectively using translucency allows iOS 7 apps to be more immersive than ever before.
Motion Effects & Parallax
The home screen of iOS 7 where you see the app icons actually responds to motion! As you move the device, iOS 7 will track motion and react to it by changing and orienting views and backgrounds to give a sense of illusion to the user that its alive inside.
Motion illusion effects also add Parallax effects that allows one to overlay and showcase content in interesting ways where you can even peek at the content below as you move the device. For example, you can see parts of the wallpaper blocked by app icons by moving the device. It's pretty cool!
View Dynamics!
Last but not the least, I want to share what puts depth, layers & translucency all together in an incredible fashion - View Dynamics!
iOS 7 incorporates a mini physics engine (for developers: UIKit Dynamics), that allows developers to build apps and interfaces that can react to physics based simulations like gravity, mass & collisions for bounce effects like the one you will see on the iOS 7's home screen.
Developers can build some fantastic UI effects and simulations using Dynamics, without embeding a game engine. Just wait for developers to innovate in this space - its going to be fantastic.
There's More
iOS 7 is clearly designed from the ground-up and for the future and I can not be more excited. I know there are skeptics, there always will be. And I don't care if the flat UI looks like Android or Windows. I am more interested in using and building the best apps and app experiences and iOS 7 have just made the mobile development field a fertile ground for just that.
Sure, it will take some time for all the developers to understand and realize iOS 7's potential and it will be a while before developers adopt some of these techniques, but with a clear emphasis on content via full screen views, translucent controls and simple flat UI and colorful pallete, this is the iOS a lot of us were waiting for.
V
@goldenv
The more you know, the more you know you don't know.
-- Aristotle
How Sublime Developers Solved "The Documentation Problem"
Sublime is arguably one of the more popular editors aside from time tested editors such as vi.
But its one of those weird editors I have run into, that despite being shockingly unappealing (I'll explain why) starts to grow on you. But despite that, there is a time of day, everyday when I am like, what are these Aussie developers thinking!!
Reindent
One of the first things I look for in an editor is code reindent - call me crazy, but I love neatly formatted code, down to the spacing. Sublime has all these fancy shortcuts for just about anything, but a genius hacker decided to leave the reindent command shortcut-less. Now, maybe the developers missed it the very first time and if you have someone scouring the web looking at how your customers are using Sublime, you will find out in minutes that people are looking for a damn shortcut to reindent.
Now here's the funny part. There are 200 pages out there that describe the exact same way to add a shortcut for reinvent.
{ "keys": ["command+alt+r"], "command": "reindent", "args": {"single_line": false} }
But, I like to know everything about such a command before plugging into my trusty editor. So, the very first thing I am curious about is what's single_line (even though its easy to guess) but more importantly what other args are there?
I want to know because as I reconstruct missing shortcuts or just add more to my liking, what if there isn't someone out there who has already worked it out. I should be able to look into the docs and find out.
Documentation
So, I go to Sublime documentation. Here's the very first line of the documentation for arguably one of the most popular coding editors out there.
The Sublime Text 2 Documentation is currently a work in progress.
Now, I was thinking, wait a minute I am using Sublime 3 (early release build - alpha something) and their v2 docs is in progress. #@?.
Trust
To me documentation is about trust. I know what its about, any details I should know as a customer and a natural place for me to learn advance tricks and plugins.
Sublime fails in my book, despite its tremendous success. And I know why such is the case for Sublime Devs.
Crowd-Sourced Documentation Technique (CSDT)
One of the early things Sublime developers probably found out is that they can get away by crappy documentation because they are already getting popular and hackers are going about writing documentation for them. I call it CSDT.
CSDT is awesome. You as a developer (mostly consisting of awesome hacker-culture coders/developers) can focus on "building" the product with the occasional documentation update which you need to build a product website and that's it. In fact, this technique was such a huge success for Sublime that the second line on the main Sublime documentation says -
Sublime Text Unofficial Documentation is an excellent resource, with a huge amount of information on Sublime Text 2.
Amazing. TDP Solved.
The Documentation Problem (TDP)
Because I am on a rampage coming up with useless acronyms. Here's one more. TDP - the documentation problem, developers and hackers around the freakin' world face. Very few developers I know want to write it, especially the external documentation kind.
External documentation (ED) vs Internal Documentation (ID)
Now, I think there are 2 kinds of documentations developers face. External is the kind you publish on the web site for your consumers, clients or sometimes internal clients like marketing, sales, VPs, etc.
And then there is internal documentation. That's documentation you as a developer for yourself, your team, and for your future code-bearer because you won't be working here for more than 2 years (Silicon valley touted average).
I understand why developers and even myself sometimes hate EDs. They need to be more formal, precise and accurate. They need very good language as your external stakeholders are reading them and often times need to be updated frequently.
But you generally should hire some part-time or full-time technical writers or assign it to a developer who can pretend-play as a technical writer and write them. I think this is something important! I know CSDT is awesome but I am not sure that's a reason to just bail out on ED. I might be alone here, but I don't get it.
As far as ID's - I am going to write a future post on IDs and my style and my team's style and how successful it has been for us (not just coming from me, but from all the developers within our cross-functional team), so I am going to keep it short here - ID's are good and I highly recommend them - but the best and IMHO the only way is to develop a team culture that supports it. Everybody has to do it, only then it works. Otherwise its very hard and that's what according to me, most teams face. A small set of developers who see the light and value of ID's and the rest just skipping on them or doing a terrible job. Tech Lead's play a role here, but the larger tech org culture is what's more important.
If you are tech org leader, think about this. And try it out. Try to embrace a ID-supporting culture. It will make the job of tech leads and hence engineers to ID a lot easier and everybody will benefit.
ID scope
Sometimes, people skip ID's because they think it needs to be long. NO. Just a diagram sometimes helps and tells a good story. Sometimes some more annotations, related ideas, notes, references help as well. That's it. Nothing fancy. Consistency helps here too - which can be tricky but tech leads can help here.
Parting Thoughts
Sublime folks chose CSDT and that's fine. Hackers won't stop using Sublime because of that. It has some of the best ideas, I truly believe so. Its an awesome editor and if you haven't given it a try, please do so! But don't expect and EDs. But I hope they have some IDs for themselves otherwise they are on a slippery slope.
CSDT also means lots of web searching, forums, etc, so be prepared for that. I personally they will be doing a huge favor for their ardent customers if they do prioritize EDs and will certainly reap the benefits of a happier customer base - as despite the need to search it will be easier to find and will better promote its awesomeness and extensibility.
V
@goldenv
The Right Brain Revolution BY AUREN HOFFMAN
_Absolutely amazing --V_ Over the next 100 years, the importance of creativity will trump systems thinking due to the rapidly escalating power of computers. No, I’m not talking about an apocalyptic “Rise of the Machines,” but rather about the future ascent of people who excel in creativity, intuition, and the marshaling of original solutions, things that computers won’t be able to do for a long time. Tomorrow’s rewards will be won by creative people who contribute new ideas. Call it the Right Brain Revolution.
A Better HTML5 spec approach for representing semantic information?
The minute I saw HTML5's semantic tags a year back, I was excited, stumped, confused, excited but at the end, still confused.
I had 2 main concerns -
Why mix semantics such as article, nav, aside, etc with style/structure - they were enough confusing already. CSS helped pull style out and try to just leave structure behind. And now semantic tags - oh dear.
Why leave so much to the developer - choosing of how to structure their web page's layout and structure? Semantic tags add to the various options, as opposed to shrink them.
HTML5 Pinterest Quiz is a good example of an article that tries to makes sense of the various layout options HTML5 allows for and requires designers to choose from one of them.
All this was caused in order to add some semantics to the core web page I believe and can aid to some extent, the developer too. Semantic layout is especially useful for bots who crawl the internet or web sites.
The HTML5 semantic markup essentially becomes the communication channel between the developer and the bot/parsing system which up until now simply did not exist.
I however do not like the current html5 spec approach. Dedicating HTML tags that are largely semantic, and mixing them with pure layout can be very very confusing, at least to me.
Semantic Labels?
I wonder... instead of semantic HTML tags, I would have proposed allowing the ability to associate semantic "labels" to HTML markup which primarily exists for the page structure logic. By label's I mean meta-data you associate with an HTML tag via the form of standard attributes, that apply to the children of that tag.
This approach is a lot simpler & scalable. For example,
<h1 semlabels="header">Ttile</h1> <div semlabels="content"> <div semlabels="article"> Foo Bar <span semlabels='author, email>[email protected]</span>' <a semlabels='action' href='...'>Share</a> </div> </div>
Now, what's interesting is that semlabels apply to the tag its associated with and its content can be treated as contextual information. However, the content can have children with its own semantic labels and so on. The developer ends up creating a tree of semantic labels that annotate the layout in HTML quite nicely, and bots get both the semantics and the content together which it can use to better understand the web page content.
Below I give some reasons why I like my proposed approach more -
Developers can freely add labels that associate all kinds of semantic behavior without tampering with the layout itself, which is a huge win
Developers can add their own labels or label extensions as opposed to a set of "approved" labels by a committee. For example, Google can publish its semantic labels that its crawler and algorithms understand. Developers can take advanlabele of them to make their site more SEO-friendly.
Its much easier to integrate in existing sites - a developer simply has to annotate their existing site with semantic behavior as opposed to completely rewrite the web page structure to incorporate HTML5 labels and their styling components.
Adding or removing semantic labels need not need another spec update.
Semantic labels being rather loose, can be more easily move around and sprinkled as the web page(s) evolve.
What are your thoughts on the HTML5 spec and semantic labels? Please share them on Hacker News.
V
@goldenv
DESIGN RULEZ #1 How to Build/Spot Sustainable, Well-Designed Software Architectures.
*This is the first article of my new DESIGN RULEZ series. [Subscribe](http://feeds.feedburner.com/vishalshah) to stay up-to-date on future articles & commentary.* ## Life can be quite complicated Life’s complicated. We generate & collect more data than ever before and our insatiable thirst for data only grows. Our devices are getting more and more sophisticated and thus complicated. There is more trickery and gadgetry packed in an iPhone 5 than your 70’s Camaro. Everything is connected. Even our power systems are now connected. Mobile devices are spreading like viruses and hence mobile usage is sky rocketing, generating all kinds of data. Our systems and architectures are getting more and more complicated by the day as we support more users, produce and process more data. Our systems are getting also increasingly intelligent and sophisticated. And all of this is on the rise. Imagine the world just 20 years from now. You get the idea.. ## Emphasize on Design & more importantly Continuous-Design So, how we can we sustain & thrive in this environment? The only way in my opinion is by employing “good design”. Specifically those who put design-first & more importantly employ continuous-design. ## What do you mean by Design? Design in this context is simply put, putting some thought into and about the problem you are trying to solve, and how you are going to attempt to solve it. Sometimes this is merely planning. Sometimes though it is whiteborading, sketching, talking, communicating, collaborating, researching and trying to put something together that will help you get early visibility on what you are trying to build and how and why. You might be a person who at the first sign of something, might go off and prototype something quickly and that’s great. But you can be at the same time, a lot more effective, if you can take a step back and try to “visualize” the problem and what you are trying to do. Its amazing, how critical this simple, “take a step back” is. For me, its so important that I have tried to solve most of my problem solving, that way - the forest. ## Why Design? Design can have such an impact to the what you try to build, that in my opinion it will dictate the product’s mere survival over time. Survival from competition, from new/fresh ideas from startups & entrepreneurs, from radical thinkers, and from just sheer expecations from users. Users have learned to expect more and more from software & hardware systems. Just read some of the app reviews on the iTunes App store for example and you will get a sense of how demanding users can get! Design is also something, that’s very fundamental. It will drive nearly all aspects of whatever project you are/will be working on. It scales from what you are trying to build to “how” you will try to prototype or build, how you will be involved, how work is shared across team members, how tasks will be shared, etc. ## What about Prototyping? I recommend you spend some cycles designing/whiteboarding/taking a step back, even before a quick prototype. It doesn’t have to be a lot. Often, just enough to get a sense of what you are trying to do and how, some sort of picture you have in mind... Prototyping all of sudden, becomes a lot more effective. Just try it, and let me know. ## What about Continuous Design? This one is obvious. As you work towards a problem, things often change - requirements change, new things come to light, time line changes, expectations change. Hence, if you are not employing continuous design in even the smallest of your personal or professional projects, you are missing out on a ton of opportunities, to the point where you might be jeopardizing the project survival over time. For some projects, this is just fine - An example is a lego set. Say, you bought a lego set and you are just excited to put something together. You might just pick up the blocks, and stack them and build something random out of them. And that’s Ok. You are just trying to make sense of it and experience them. But the minute, you want to do something more interesting with them, clearly the above strategy won’t work, even though you have something in mind in terms of what you want to try building. Imagining it, picturing it and trying to figure out some sort of strategy, will not save a ton of time and frustration down the road, it will help you actually build, what you are trying to! ## DESIGN RULEZ Series I am starting this DESIGN RULEZ series to share and promote my ideas, hoping it will help somebody :) The hope is that these ideas & principles could serve as a helpful tool to evaluate a new or existing, internal or external software project for a variety of reasons. Or more importantly to build a sustainable product/system architecture and processes. Some of the ideas could also reveal interesting insights into a project’s health & quality. There is no exact science here, so don’t take these literally. I present them as guiding principles that are common among my favorite systems developed. So here we go... > What do I mean by a “Software Project”? Its a project worked upon by a group of engineers. In some cases, for large applications/frameworks, a project in this context boils down to one or many of its components. ## How to Build/Spot Sustainable, Well-Designed Software Architectures - Part One In part one of this series, I am going to address this question I have had for a while by starting with source control, one of the best places to start while evaluating or building software projects. Yes, even something like source control can use some design love. And I will talk about some of the reasons as to why so... ### Source control Obviously source control is essential, but inspecting the source control tells a lot about a project. For small projects, a single repo is enough. For larger projects, I really think projects should be neatly broken down into multiple repos. A repo for a logical component. With git, this becomes a lot easy, hence I highly recommend git for all projects if choosing an open source technology. Perforce rocks as an awesome commercial source control technology. Ideally, all the repos should be using the same source control technology. A varied set of repos generally infers the existence of legacy code. That doesn’t necessarily mean a bad thing, but it does :) Something to keep an eye out... But in my book its a clear concern for most active projects. Next up, the the directories & files within source control should be meticulously named and organized. Lets take the example of the open source [scala programming language project](https://github.com/scala/scala). scala/ +--build/ Build products output directory for ant. +--build.xml The main Ant build script. +--dist/ The destination folder for Scala distributions. +--docs/ Documentation and sample code. +--lib/ Pre-compiled libraries for the build. | +--fjbg.jar The Java byte-code generation library. | +--scala-compiler.jar The stable reference ('starr') compiler jar | +--scala-library.jar The stable reference ('starr') library jar | +--scala-library-src.jar A snapshot of the source used to build starr. | ---ant/ Support libraries for ant. +--pull-binary-libs.sh Pulls binary artifacts from remote repository. +--push-binary-libs.sh Pushes new binary artifacts and creates sha. +--README.rst The file you are currently reading. +--src/ All the source files of Scala. | +--actors/ The sources of the Actor library. | +--compiler/ The sources of the Scala compiler. | +--library/ The sources of the core Scala library. | ---swing/ The sources of the Swing library. +--target/ † Build products output directory for sbt. +--test/ The Scala test suite. ---tools/ Developer utilities. You can tell that the directory structure is well-designed and consistent. Note the naming conventions, all very consistent - concise, lower case, use hyphens to separate words. However, even a nicely designed project and repo, there are still some things I am not terribly happy with it. That speaks a little bit about myself :) You can imagine how I react if I see regular project structures out there... #### Consistency & Well-Designed Consistency is the first item I want to discuss. When I first check out source control, the folder structure and files should look consistent, and well designed. All file names and folders should follow the same case convention (minus some exceptions like README). They should use the same word separator - CamelCase or “-“. I should be able to see all the files in a folder in my screen without scrolling. If I have to scroll, break up the files or folders into folders. This might sound crazy, but you will be surprised how effective this can be. Just give it a try and let me know your thoughts. #### Documentation For one, I personally do not like the idea of including documentation (docs) as part of the the core codebase. Few reaons why - you are seriously including the size of the repo clone, checkout, merge etc. It gets worse as the documentation grows as more pages are added including things like localization, etc. Now how do I spot this inconsistency? To me, it just doesn’t seem coherent enough. If you are a scala developer you might disagree and mention that docs are maintained by developers who commit to the codebase. Well, that’s Ok, you can easily include projects from multiple git repositories yet work with them together using [git submodules](http://git-scm.com/book/en/Git-Tools-Submodules). That’s why choosing the right source control so incredibly important. It sets the tone for future development and build processes! Other source control technologies have similar concepts to work with multiple repos at the same time. The advantage now for developers is that cloning, etc are much faster and frankly I am strong believer in seeing only the things that matter to my work. Even scanning through excess crud slows us down. Note, source control is terrific, but sometimes the added cost and complexity might not be worth it. For many projects, documentation might better sit in a CMS or wiki as long as they have history support and are properly organized with project versions in mind. Imagine if the project attracts technical writers. Instead of forcing them to check out and check in updates, a better CMS might be much more efficient. Also, for documentation, I believe in one thing - eliminating as many barriers as possible to get someone to author. The more the constraints, the more likelikhood it will get snoozed on. If I could update the documentation from my MBP, iPad or iPhone, I am more inclined to update it often. Besides, most projects will have some web documentation anyways. Why not combine the web and project documentation in one CMS. I also like CMS that support easier integration of diagrams, pictures, etc. ##### Documentation Templates It’s important to have documentation templates, to have the documentation look ridiculously consistent. Just remember when you last ran into a project with awesome and beautiful documentation. What was your first impression? That’s the kind of impression we are looking for from new folks who join the team or folks who check out our project. ##### Documenation Categories Don’t lump all documentation on one top-level page. Check out [ruby-lang.org](http://www.ruby-lang.org/en/documentation/). Notice documentation is broken down in to getting started, manuals, reference, editors and further reading. Its very clear to me where to go for the appropriate piece of documentation I am looking for. Notice, docs within each category share the same template for consistency. #### Developer Documentation Like most good projects, it makes sense to author a how-to developer documentation explaining who to get started, author code, build, code conventions, design, code review & submission processes. Developer documentation should not be checked in but in the project’s CMS like discussed above. And developer documentation should be separate than the project’s documenation. #### Consumer Documentation Some projects have consumers who are interested in building it for other projects. They are not necessarily interested in the project itself for the most part, other than just how to build it. This should be documented in a separate section, making it easy for others to integrate your project with others and become popular! Little things like this help spread the word, and help get viral. People remember such things and like to share good experiences with others... #### Who’s Who? Clearly noting who the lead and contributors are encourages better communication. Its simple, just try to consistently keep it updated. ##### Really? Frankly, I will be honest here. If you think this is too much and choose to just ignore this, in my opinion, you should not make the project open to others. If you want to work with others, pay some attention to this. #### Architecture Diagrams I also recommend associating an architecture diagram at the top level of all components and if necessary, the sub-components as well. Just imagine this - your project is nicely organized and divided into components across directories and repos, as discussed above. And at every level, as necessary, I can just open a diagram to visualize how the component is structured, designed and how it fits in the larger picture. This does not have to be fancy. Even an ASCII/text file will do it, as long as the representation is visual. I do not want to be reading text and paragraphs at that time. #### Sub-Projects Well, I think the whole project can be broken down and split in multiple sub-projects as repos! This directory structure and repo is frankly intimidating to me! You might feel right at home, but frankly, when I started diving in the codebase, I was lost, as to where to start! But, I am blaming anybody. This is a very typical structure for projects like these. I have seen it over and over and it works. But I am disappointed, it has not evolved as I would have liked. Here’s how I would further restructure the scala project. Scala has a core codebase for the language and a separate set of large libraries exist to work with the core language - compiler, actors and swing. These are not 3rd party libraries and hence I think, they are better classified as dedicated projects that can evolve on their own and better yet, as a scala core developer I can choose to not worry about if I don’t need to. And I can always pull in these libraries as submodules if I need them. If these libraries were small and very tightly knit to this project, there might be value to not create a different project, however I recommend at least creating a scala-libraries repo where all the libraries go, so in the future if you have more libraries, they fit right there. For 3rd party libraries that the project does not own, the project’s build system should configure them so the build scripts pull them before building and the documenation point to the appropriate project sites as a courtesy to others. Another subtle benefit of the above approach which I bet most people won’t realize at first is that, creating separate projects for libraries allows for better, distributed ownership model. I consider this an important aspect the leads should think about that often. Code/Project ownership drives the project’s direction and evolution. Also, this enables the developers to support multitude of developers without incorporating all of them in the core scala repo. Such a relief. It allows opportunities for 3rd party developers to create their own libraries/dependencies and fork/extend the core source code to take advantage of, without always going through the project lead, an incredibly powerful idea. Also, this allows for the libraries and dependencies to have their own code conventions, and dependencies, essentially creating a tree of projects and their dependencies. A good example is the facebook [scribe project](https://github.com/facebook/scribe) hosted on github which depends on the [thrift framework](http://thrift.apache.org) which is hosted on apache.org. #### Dev Tools Finally developer utilities and tools, I am not so sure. I think there is value in having tools associated with a project, to automate etc, but often times these tools end up related to building the project or setting up the runtime/OS environment. I also dislike that all the tools are in a flat directory, as opposed to organized in folders. Maybe they started as a just a small bunch, but that’s what differentiates a good project from great. Continuous improvement, relentless effort to keep the project structure and codebase beautiful. As the tools grew, someone/lead should have noticed it and created a folder structure to organize them. #### Bug Tracking Bug tracking is something I think should be very well integrated with source control and this can be sometimes tricky, but I encourage you try hard to make sure that is the case, as it can be very rewarding. Knowing a change is one thing, but why it happened is something that’s a lot more powerful. And sure you can check out the checkin comment to get an idea but how many checkins involve changes to just one file. Most checkins involve many files and how do I connect what changed. Integrating with bug tracking allows me to simply tie a bug tracking id with my checkin, and really that’s the most important part of the checkin message. I should just be able to look that tracking id and find out all about the change, why we made it, who requested it, who filed it and what was the priority, what release(s) it made it in, etc... Now, that’s powerful. I am disappointed, so many project leads don’t require tracking id’s as part of the checkins. Its a must. There is another subtle but important benefit here. This gets people in the habit of filing bug tickets before checking in, making sure we have some of the important meta data for the change! This is part of the cultural change I had described above. It does not work if just one individual follows this. The power comes when the entire team operates like this. And contrary to popular belief, this can be applied to open source projects as well, not just closed source. For example github has an integrated bug tracking system with unique bug ids that can be associated with code checkins. #### Designing for Source Control Performance Often times, leads, managers ignore the performance of the source control server. I can not emphasize how important this is. Low performance and latency on source control servers, generally will still get the work done, but what most don’t realize is that developers will adjust their development processes and style with it. For example, there are some source control best practices that become difficult to follow if you don’t have a high performance source control solution. * Checking in code often * Cloning, forking codebases and submitting patches * Create dev/feature branches as opposed to working off the main branch * Deleting old branches as part of regular cleanup * Regular merging on branch updates * Tagging releases and milestones frequently * Setting up notifications on state changes in the source control You inhibit developer productivity and unknowingly are creating and environment that encourages potentially poor source control practices just because the source control system is not awesome enough. Its not that high of a cost compared to other systems we maintain anyway, and the benefits can be huge. Worst case, developers will have one less thing to worry about and complain. So, unless you are strapped startup, please spend some time designing a high performance source control solution and ideally have one or more team members focused on maintaining and evolving the system. #### Designing for Source Control Tools This is directly related to source control performance.There are some really nice tools out that one should invest in. As codebase grows and more and more projects are being developed and sustained, it becomes increasingly important to build and support a bunch of tools, to simplify a developer’s life. Tools such as scripts for common/mundane tasks, scripts to integrate with commit hooks and project lifecycle, visualization tools like [Gource](http://code.google.com/p/gource/), tools to merge code, etc.. Often times individual developers have to come up with their own solution to these problems. Its not optimal as the org ends up with many different styles of development. And if you are a large organization, you often don’t let the entire company know, you have built a cool source control utility to solve something. Hence, I highly recommend putting some thought and design into the various tools developers will need and build a system to share these tools with others. #### It’s Cultural A lot of what I discussed is cultural and more effective if everybody in the team embraces as opposed to one person relentlessly trying hard. Its unfortunate but there are organizations where this might not be a hit, but we are talking about building and spotting some of the best built software projects around, and yes it takes some effort to get there. But the rewards are equally amazing. ### That’s All Folks? That’s not all! In future articles, I will be covering a lot of sticky topics that I consider important such as Versioning, Continuous Integration (CI) & Design principles such as Less is more, high level client, API, middle tier and backend server software architectures, team process and culture best practices and other interesting tidbits such as RESTful vs Binary APIs, Synchronous vs Asynchronous (non-blocking) IO, etc... As you can imagine “design” is loosely referenced here and that’s the idea. It essentially translates to putting some thought in these matters, and I think they in turn drive the success of the team, the products, the organization. [V][1] [@goldenv][2] [1]: http://www.vishalshah.org [2]: https://twitter.com/goldenv
A journey of a thousand miles begins with a single step.
Lao-Tzu This is the theme behind the awesome Japanese technique that advises to make small steps for continual improvement as opposed to constant disruptive change. You are better off with small steps, then large. Want to get a handle on your to do list - start making small progress. Break the items down in tasks after prioritizing. Get in a habit of making small steps and before you know it, you are on your way! V
My last quote on ship building and motivation
That's how I like to work and create and foster that kind of environment. I am surprised even today how so few people "get it". The quote is from 1800 or something. --V PS. I found the quote from a mindgym workshop.