Best practice for software development

Almost more than 3 years since i’ve been part of projects run by Agile, i had the chance to participate it in different roles and places in the whole project lifecycle, starting from Developer passing by being an Technical Lead, Business Analyst, Team leader, and finally a Project Manager. It was absolutely a long journey with good, bad experiences, joyful, sadness, difficult moments, hard situation, stressful situation, and a lot of lessons learned and knowledge gained!Being Agile

Going through my past 3 years i can see clearly the main ideas that made this journey fruity at the end, i can sum up these ideas in the following points:

  1. Don’t walk ever without a goal and a vision to achieve that goal.
  2. Believe in your work, yourself, your vision, and in your colleagues.
  3. Be Smart, Flexible, and Responsible.

Of course Agile is more than that, but i guess on the 2nd level of details, but on the 1st level of main ideas, i think this is what all about Agile!

Working as a team lead and Project Manager in Agile process gave me the chance to observe the whole situation from a higher view, a god view if you like. Also working in long running Agile projects showed me how the process evolve and how people become more familiar and adoptive to it everyday, it gave me the chance to experience and see all the lessons and practices I've been reading in Agile books, cause long running projects is a complete life with its ups and downs, failures and success, good persons and bad persons. and if you want you can observe all of that during the long running project.

Summing up the good practices and lessons lead me to the following list:

  1. Focus on People: They are the constructors in this industry; they are everything, they deserve all the attention!
    • Share the vision with them clearly and honestly, people perform better when they understand.
    • Build the trust bridge between you and everyone in the team, speak with them individually, listen to their thoughts and complains, take actions when it’s necessary, and if it’s not possible; explain why!
    • People are more important than Processes and Tools! never pay more attention to a tool more than a person in your team.
    • Give them a space to perform, back off and let them finish the work, observe closely the progress but don’t let them feel it. The more the pressure increases in the project the more space you need to give them so they can finish!
    • Show them what goals they are hitting, share the goals achievement lists with them; take with them on group explain what were the goals and what we had achieved; speak with each member individually showing him the goals he needed to achieve, show him what he hit and what he miss!

    1 - Focus on People

    • Be Positive. People are very sensitive to negative emotions, be always positive with them, give them hope and inspiration.
    • Appraise them with any possible facility you got in hand, even if this facility is just some congratulation words.
    • Make a family of your team; get them close to each other. let them set together regularly, work in same location and space, hang out with them.
    • Understand their needs, to be able to motivate them.
    • Celebrate success with them.
  2. Build a Team: 2 - Build a Team
    • Think of a small group of members (5 to 8).
    • Hire the right team members; interview them yourself, test them yourself.
    • Use cross functional team; everyone is working everywhere in the project.
    • Build the sense of responsibility inside them, learn them how to value their work and care about their final output.
    • Agile teams are self-organized; don’t just select someone in the team to be responsible after you about organizing people; instead teach them how to plan and think of priorities and then leave them to organize themselves.
    • Evaluate team as a unit; don’t just evaluate each member individually also evaluate the whole team as one unit including yourself and share the result with them and think with them where are the problems and how you can fix it ?
  3. 3 - Be Simple, Be IncrementalBe Simple, Be Incremental:
    • Start thinking about your system as advanced and huge as you can imagine.
    • Set clear defined goals for you project, and incrementally build it step by step.
    • At your first design focus on solving the project risks as simple as you can.
    • Put extensibility in mind but always remember that simplicity should be in the same equation!
    • Work Iteratively.
  4. Simple Executable, and collective ownership Architecture:
    • Don’t build the system architecture by yourself; instead lead the building process; give everyone in the team the chance to share with his ideas in the design. 4 - Architecture
    • Build Executable Architecture, use small spikes/prototypes to sketch your ideas in code, don’t just sketch ideas on papers.
    • Break down the design into small pieces and allow each one in the team to work on a piece.
    • Use Simple tools (Whiteboards) for communicating your thought and ideas; architectural diagrams and models made for that purpose; teach your team to think and express in visual ways.
    • The more you hear this from your team member “I’ve design this ..”, the more confident you are on the right way cause you had build a collective ownership architecture.
    • Start with simple, exactable, and extensible architecture in project start, and accumulatively enhance and add new feature to your design all the way to project’s end!
  5. Accept Changes All the Time:
    • Avoid defining all requirement at the start of the project! instead try to understand the available requirement.
    • Hunt as much assumption as you can at the start; move your goal from knowing everything to clear unknown points; remember that unresolved assumption become risks during the project constructions!

    5 - Accept Changes

    • Build a clear simple product backlog at the start contains main project decisions and features.
    • Dive deeply in feature’s details at the start of the iteration containing the feature!
    • Accept the fact of changing requirement and priorities and work for it from the beginning!
    • Be honest and advise the customer, customers accept negotiation and sometimes don’t see the clear picture that’s why they ask for changes, be his technical eye and let him feel you are work for his benefit and please do.
  6. Beautiful Code: 6 - Beautiful Code
    • Select a standard way to write the code, the more people from the team involved in choosing this standards the more people comply to it.
    • Emphasize to people why we need to follow standards.
    • Teach them to use comments whenever it’s applicable to be guide on the rood for other colleagues.
    • Enhance and review your standards model as project goes.
    • Use Code Review meetings as a tool to share experiences between team members and enhance the project’s code.
    • Encourage Code Spikes, Pair Programming, TDD, and anyway the team feel it will increase its productivity as long as it will not affect any tradeoffs of the project.
  7. Testing means Done:
    • Having a specialized role in your project for testing is not a bad idea, but making this role responsible for the whole testing process is a bad practice.
    • Everybody including you should be part of the testing process.
    • Testing a feature is required to mark it “Done”; that’s why developer must be involved in testing scenarios.
    • Testers are no less than developers; they are carrying 50% of the product manufacturing.
    • Teach developers how important Unit test for their code as an early safety net to discover issues before functional tests.
    • emphasize the concept of collective ownership for unit tests, anyone changes anywhere needs to makes the previous unit tests green and adds new green unit test for his modifications. 7 - Testing
    • Use different types of tests depending on your project type; but any project should have at least 3 main type of test (a) Unit tests. (b) Functional Test. (c) Acceptance Tests.
    • Everybody in the project should be part of the testing cycle, from the customer (acceptance tests) to developers (unit tests); the more you can involve people in running tests on the project the better quality product you will have at the end.
    • Whenever it’s possible GO for Documented Tests.
  8. Art of Documentation:
    • Fact: No one love writing documents; and no one reads them, but yet there are a very slick slice of docs are important.
    • 8 - Art of DocumentationDon’t make people fill documents that are not important or you know it will not be useful.
    • Show people why this document are useful before they writes it; learn people how to use the project documents instead of asking each others; remind them whenever they use some docs they had wrote before how this docs was helpful for them now.
    • Use visual documents, diagrams, flowcharts, charts, and images.
    • Minimize documentation to the absolute necessary.
    • Everyone owns any document; we are working together, anyone allowed to update in any document as long as there are a good reason and we keep history of the changes.
  9. Smart Process:
    • If you don’t have a process to start with, build a simple one that fits the current environment and people then start enhancing it as projects moves.
    • If you do have a process examine if it fits the current environment and people; make necessary changes then start immediately.
    • Don’t copy processes and rules from books; be smart read what others do and select, develop what you can use of their practices in your current project. 9 - Smart Process
    • Discuss your process with the team; there are always a room for improvement.
    • enhance one practice or activity each phase; don’t make major changes, people hate major changes they don’t believe it will do anything and they take time to adopt to it.
    • Keep your process stable for some time, people need to be comfortable and adoptive with the process before they can share with ideas and enhancements!
    • Forget about Tools, focus about practices.
    • Processes are not written on stones, do changes whenever you feel you need it; be flexible when situations require that.
    • Make your process clear and understandable for everyone in the team; don’t hide anything or use any secret roots in the process.
  10. A Manager for A Project: 10 - A Manager for A Project
    • Be transparent, honest, direct, and positive.
    • Teach people that management is part of the project roles it’s not a higher level or position.
    • Know that “you can Delegate Tasks, but you can’t Delegate Responsibility”; you are always responsible even if it’s not your fault.
    • Responsibility is share between everyone in the team, if one failed we all failed!
    • Smash the manager’s door red lamp; work closely with your team, set next to them, be transparent about your work with them, whenever it’s possible share information about your tasks and work with them, don’t just say i’m busy when you are needed, explain why you are busy.
    • Lead people, Manage Project.
    • Listen to the team, listen to everyone thoughts and complains, build trust between you and people work with you, make them comfortable talking about problems and criticizing anything they want including you!
    • Delegate some of your tasks to team whenever it’s possible, so they can see and feel what kind of work you are working in.

Java Web Application Frameworks

A comparison of the most popular Java Web application frameworks:

Java Web Application Frameworks


Refer to this link for more detail: www.googlevolume.com

Visual Studio Themes

Spice up your IDE… whatever your motivation - nostalgia or just the desire to be different. Visual Studio has the handy feature of allowing you to export all of it’s settings to an XML (.vssettings) file. This allows you to export font, color and text editor settings. I have scoured the internet looking for examples of visual studio settings files… and compiled a short list here. Where possible, I have credited the author. If you would like me to add your favourite visual studio settings file to this list, please email me adam notimplementedexception.com.

Dark Side by Dave Reed

Dark Side

Download Dark Side Settings File

Default exported from Visual Studio. Use to restore the default Fonts / Colors only.

Default

Download Default Settings File

Vibrant Borland by Mawi

‘Vibrant Borland’ Visual Studio 2005 Fonts / Colors

Download Vibrant Borland Settings File

Vibrant Jedi by The Joyals

Vibrant Jedi

Download Vibrant Jedi Settings File

VSMac by Mac

VSMac

Download VSMac Settings File

Subtle Blue by Mark Rainey

Subtle Blue

Download Subtle Blue Settings File

Resources: NotImplementedException

T4 Templates

T4 Templates (Text Template Transformation Toolkit) is a code generation engine in Visual Studio.



David Hayden (from Patterns and Practices) show how use T4 Templates.

T4 Editor is a fully integrated into IDE, offering you support for colorization of the different T4 template parts.

Resources: refact.blogspot.com

Patterns & practices for Web Services

Microsoft has published Web Service Software Factory, it is designed to help you quickly and consistently construct Web services. Tools, patterns source code and guidelines.
  • Designing ASMX and WCF messages and service interfaces.
  • Applying exception shielding and exception handling.
  • Designing business entities in the domain model.
  • Translating messages to and from business entities.
  • Designing, building, and invoking the data access layer.
  • Validating the conformance of service implementation, configuration, and security using code analysis.
  • Planning for the migration to WCF.
  • Applying security to WCF services.
  • Applying message validation.




Resources: refact.blogspot.com

Performance comparisons LinQ to SQL

CodeProject article comparing performance using ADO and LINQ technologies.



NArrange

NArrange is a tool that organize your .net classes.

Some features highlight features :

  • Reduces the amount of time developers spend arranging members within code files.
  • Helps enforce coding style standards
  • Group similar code members into predefined region blocks
  • Reduces the amount of time spent searching for specific members in a code file
  • NArrange allows you to configure how members are organized
  • Sort Usings




You can see more information in Codeproject article

Resources: refact.blogspot.com

Clone Detective

Clone Detective is a add-in for Visual Studio. This pluggin allow you localize duplicate code in your projects.

Duplicate code is the number one reason for refact your code.



See Clone Detective in action.

Resources: refact.blogspot.com

Managed Extensibility Framework (MEF)

The Managed Extensibility Framework (MEF) version 4 is published.

MEF is a library to build extensible applications (Plugin Pattern).

  • Provides a standard way for the host application to expose itself and consume external extensions.
  • Offers a set of discovery approaches for your application to locate and load available extensions.
  • Allows tagging extensions with additonal metadata which facilitates rich querying and filtering.

15 Opensource Blog Tool and Publishing Platform

1. Wordpress

Wordpress

WordPress is a state-of-the-art publishing platform with a focus on aesthetics, web standards, and usability. WordPress is both free and priceless at the same time.

Needless to say that it is the most popular among all publishing platforms available.

2. Serendipity

Serendipity

Serendipity is a PHP-powered weblog application which gives the user an easy way to maintain an online diary, weblog or even a complete homepage. While the default package is designed for the casual blogger, Serendipity offers a flexible, expandable and easy-to-use framework with the power for professional applications.

3. Movable Type

Movable Type

Another promising open-source blogging engine. Flexible enough for custom blogs and websites and powerful enough for the most demanding content management and social media needs. You can find more details about movable type here.

4. Dotclear

dotclear

Dotclear is an open-source web publishing software created in 2002 by Olivier Meunier. A one man’s project at first, Dotclear soon gathered a team comprising different personalities with various backgrounds.

The project’s purpose is to provide a user-friendly tool allowing anyone to publish on the web, regardless of their technical skills.

Dotclear is a free software primarily designed for its users and regularly improved by their contributions. Everyone may use it and modify it according to the software license.

5. Nucleus CMS

Nucleus

Nucleus CMS is also a popular content management system. It is actually more than a blog engine. Nucleus supports a multi-lingual and multi-author blogging environment. Some other extensive features are the availability of a huge number of templates and plug-ins, an easy administration panel, easy syndication support, etc. Nucleus exposes a rich set of APIs to extend it via plug-ins. Administration of Nucleus is more complicated than that of other blog engines.

6. Life Type

Life Type

LifeType supports multiple blogs and users, media management, generation of standard content, clean URLs and support for subdomains.
LifeType is released under the GPL license, and requires PHP and MySQL to work.

7. Boast Machine

Boast Machine

boastMachine is an open source, state of the art publishing platform written from scratch, that makes your web publishing experience so fun and easy as never before! From the fully automated installation to advanced content management featuresto spam fighting, boastMachine provides you with all that you would ever need!
It is written in PHP and backed by MySQL.

8. Text Pattern

Text pattern

Textpattern is a flexible, elegant and easy-to-use content management system. It is both free and open source.

When it comes to publishing on the internet, beginners and experts alike are met with a bothersome paradox: word processors and graphics applications allow anyone to do a pretty good job of managing text and images on a personal computer, but to make these available to the worldwide web – a seemingly similar environment of documents and destinations – ease of use vanishes behind sudden requirements for multilingual programming skills, proficiency in computer-based graphic design, and, ultimately, the patience of a saint.

9. b2evolution

b2evolution

b2evolution is a powerful blog tool you can install on your own website.

It includes all the features of traditional blog tools, and extends them with evolved features such as file & photo management, advanced skinning, multiple blogs support as well as detailed user permissions.

10. Eggblog

EggBlog

eggBlog is the free php & mysql blog software package, allowing you to create your own online website, journal or weblog (blog) using your own web-space. Powered by PHP and MySQL, eggBlog has a wide range of features including: easy to use web-based administration to add, edit and delete news articles, easy to use web-based configuration to manage your web site setting, WYSIWYG easy-to-use text editor for publishing or editing news articles, download themes to easily change the style, layout and colours of your site and more. Read more about in their site.

11. Zomplog

Zomplog

There are many great weblog systems around, but they all require technical knowledge from their users. Zomplog is different: it let’s you focus on content instead of code. Software should empower you to do great things, not stand in your way. Zomplog has been designed to be logical and easy to use for anyone, not just programmers. View more details here.

12. Subtext

Subtext

Subtext is a personal blog publishing platform that focuses on usability, elegance, and simplicity, it is written in C# for the ASP.NET platform. If you’ve ever caught yourself throwing your hands in the air and declaring that you’re going to write your own blogging engine, then Subtext is for you.

13. BlogEngine.NET

Blog engine.net

BlogEngine.NET is an open source .NET blogging project that was born out of desire for a better blog platform. A blog platform with less complexity, easy customization, and one that takes advantage of the latest .NET features.

BlogEngine.NET was designed using the current .NET framework and focused on simplicity, ease of extendibility, and innovative features. With BlogEngine.NET, we hope to create the natural blog of choice for all .NET developers world wide.

14. TriptychBlog

TriptychBlog

TriptychBlog is an open source, Microsoft® ASP.net 2.0 powered blog currently in development. Although not entirely complete, TriptychBlog still boasts some impressive features; while still being standards compliant, customizable and free.

TriptychBlog is powerful enough for corporate use, but still maintains an intuitive interface allowing anybody to create a personal blog.

15. Presstopia Blog

presstopia

Presstopia Blog is a standalone, open source weblog application that runs on the ASP.NET platform. The software is 100% free of charge, and licensed under an Apache Open Source License. It includes all the features you need to run a great blog, without the clutter and clunkiness so often associated with other high-end blogging applications.

Resources: blog.insicdesigns.com

Creating your own site's search Engine

Setting up you search page for your web application is as easy as having a DB table where you retrieve data from by a simple query. I will illustrate the steps of setting up the configurations needed in this post, and will write another one for detailed stuff in custom search page. So lets start.

Setting up your Search Index

  1. start>run> type mmc
  2. in the new window, File> Add Remove Snap-in, or press CTRL + M as a shortcut
  3. Press Add, and choose Indexing Service from the List box as shown below
    clip_image001
    Press the Add button.
  4. A dialog box will appear asking you about the Computer name you want to apply the Indexing on, choose the local computer for this Demo.
    clip_image002
  5. Close all dialogs you have on your screen until you reach your Console Window, with Indexing Service running.
  6. Right Click on the Indexing Service node under the Console Root, and choose New>Catalog.
    Make sure that the Start option in the menu is activated before doing this step, otherwise, you have to stop the service first.
    clip_image003
  7. Give the new Catalog any Name. I will call it PP4.
    Browse to a directory where the Catalog file will be stored in. This is not the directory which you want to Index.
    clip_image004
  8. You will find a new node called PP4 just appeared under the Indexing Service node.
    Now we want to tell the new Catalog to search in your site. Right click on the PP4 Catalog, and choose New>Directory
    clip_image005
  9. Now fill in the Data as below
    clip_image006
    The Path, is the Physical Path of the website you'd like to Index. Finally press OK.
  10. Now right click on the PP4 Catalog, and choose Properties. Go to the tracking tab, and change the WWW server to your Default Website.
    clip_image007
  11. Now go to the Generation tab, and uncheck the checkbox "Inherit above settings from Service".
    clip_image008
    It Enables by default the "Generate abstracts" checkbox. This tells the search index, to get some text from the searched pages, just like Google.com for instance when they get you a sample text under each item in the search result. The default is not generate any abstracts. This text is by default the first 320 characters in the page. You can customize that just by adding some text in the "description" meta tag in the HTML's head section.
  12. Now start the Service.
    clip_image009

Now we are done with setting up the search index configurations. Next you have to create a page that calls this catalog for searching. But before doing this, lets try to figure out whether everything is working fine or not.

Querying your Search Index through the built in page

Under the PP4 Catalog we have just created, you will find a node called "Query the Catalog". Press on that node and a page will load up at the right part of the window as shown below. Here you can try by typing "Partners" for instance, and have a look at the query result. As you can see, the query includes .cs, .vb, .css files and many other types of unwanted files. you can control that by creating your own page, using your own code.

clip_image010

Querying your Search Index through a custom page using Query Language

I will go through the main parts of the query, and you can figure out the rest. It's as if you are querying a simple SQL Database and binding the results to a Repeater.

Connection:

OleDbConnection odbSearch = new OleDbConnection( "Provider=\"MSIDXS\";Data Source=\"PP4\";");

Please note that the Data Source is the Catalog name you specified in the Search Index configurations.

Command:

cmdSearch.Command Text = "select doctitle, filename, vpath, rank, characterization from scope() where FREETEXT(Contents, '"+ searchText +"') order by rank desc ";

Where the "searchText" is the text you typed in the textbox for searching.

The rest is as easy as executing the query and binding the results to a repeater.
I have made one on my own and took a snap shot of the running program below:

clip_image011

Resources: techietweaks.blogspot.com