the product owner has all the stories prepared on story cards, so that the estimation can start immediately
Well add member variables for the name, index and number of days, a constructor with arguments for each of these values and well provide getters for retrieving them. Additionally well add a method for calculating the correct number of days depending on a given year, considering leap years.
7) Find the pitlls
I warmly recommend the use of this great feature of the Java language. It definitely adds more type safety, ease of use and security to your application. But unfortunately it seems to me, that it still hasnt reached the popularity that it really deserves, yet..
Say thank you, praise their work after the demo, be constructive with feedback even if its negative. Be understanding if there are personal problems or sickness. Youll get rewarded when you desperately need their help someday. Theyll love to help you in case of an emergency. What goes around, comes around.
JANUARY, FEBURARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER,OCTOBER, NOVEMBER, DECEMBER;
In our weekly backlog grooming meeting I put Planning Poker cards onto the wall in the right order, as table header the usual 1,Core 2,3,5,8,13,20 sequence. Then I randomly handed all the stories to the 7 team members 3-4 stories each. I had explained the whole backlog to the team briefly and answered some qucore-dump? Coreestions, so every team member was able to visualize what the project was all about. The team members estimated their stories quietly and put their story cards underneath the corresponding planning poker card. Within 5 minutes my first complete estimate of the backlog was on the wall. We wrote the current estimation onto each card.
In the next step, the team members moved the cards around if they were not happy with the current position on the wall no discussions allowed. The new estimation was written onto the card right after moving it. Some cards were moved back and forth a couple of times indicating that it probably wasnt clear enough.
As the Scrum product owner of the german Telefnica o2 online shop I was recently assigned the project of building a mobile version of the application. The project is currently under construction but still the whole topic of mobile web development was relatively new to me not as a user, but as a creator of applications. Sure enough, I can join in on a mobile web bull bingo game, but never having built something myself didnt feel right. Thats why I decided to mess around with the topic a little bit myself.
1) Embrace Proposals
Monitor the servers using tools like munin. CPU and Memory usage can show you which part of the architecture is stressed. In some cases the webserver idles most of the time, while the database machine is under heavy load
the team should know in advance what the backlog is about, have a clear vision of the objectives of the project
2) Think win-win.
3) Dont just think in terms of man-days.
The clearer and the more complete the definition of the deliverables, the less potential for discussions with the customer therell be. Not only mention what you will deliver, also mention what you will not deliver. If the proposal is about writing a custom intranet application, be sure to mention that setting up the production and staging environment is not part of the proposal if, of course, someone else is in charge of that. Sometimes, out of laziness, we write stuff like standard reporting 1000$. The customer will probably have a completely different opinion on what a standard report is than you. Sentences like this have the potential of eating up your profit, because the customer expects you to make him happy. And instead of a CSV export of customer addresses, you find yourself writing a full featured CRM application.
NOVEMBER, , ,
Thats an easy one. If you fill in a little bit of fun during meetings they are so much more fun, the team is a lot more motivated and they enjoy working together with you a lot more. If the meetings you are responsible for are fun to be in, people will like to attend. And do not forget to celebrate sucess. Bring candy to the sprint review. Champagne or beer after a major launch depending on the teams preferences.
Scale horizontally by adding machines, which is a lot easier for web servers as it is for database servers
In the last post I wrote about ways to tackle bottlenecks and to increase the performance of an application. When dealing with a high traffic application servicing tons of concurrent users all requesting the same data, intelligent caching can boost the speed in which requests are processed. As a result, lots of load is taken away from the database.
According to a study by Queen Mary University of London 1 in 6 cell phones have fecal matter on them. And there are 18 times more bacteria on a cell phone than on a public toilet flush handle. The reason: bathroom social networking the new megatrend.
. = numberOfDays;
1) Add the OSCache jar file to your classpath, put the tld file into the WEB-INF directory of the webapp and declare the OSCache taglib in your jsp page:
The api for locating your current position is astonishingly easy to use. All you need to do is call the function and pass references to callback functions for success- and error handling as parameters.
Since were passing ints to the set method, it is possible to do something like this, without having the compiler complain about it (seen it done before):
Dont be too cheap, dont be too expensive. Just be ir. Customers are smart they know if they can trust us or not. Both being too cheap and being too expensive may seem like loose-win or win-loose at first sight, but will lead to a loose-loose situation in the long run. If youre too cheap, the customers get used to your prices and you wont enjoy working for them anymore. Being too expensive will lead to unhappy customers, because they wont trust you and find someone else for the job. We are exchangeable.
But we can add a little more brain to the implementation:
7) Blurry details, blurry price
5) Be complete and be clear
So how does it work?
navigator..storeCurrentPosition, errorRetrievingCurrentPosition;The function called in the case of success receives the current position and you can extract the values for latitude and longitude like this.
trackingPoint = TrackingPoint Date., position.., position..,
Recently a co-worker from another unit mentioned the concept of magic estimation to me, so I decided to try that approach for the challenge I was cing.
. = name;
I spend about 45 minutes a day sitting in the car so a couple of years ago I decided to spend that time in a more useful manner. I started listening to audiobooks mostly non fiction and it is now a habit. Last week I was browsing the itunes store for new audio books and found this: Zen to done, written by Leo Babauta, mous for his blog Zen habits that I didnt know before.
One part of reviewing and rectoring code is finding and removing code smells. An example, which I encounter quite often is the outmoded manner of coding Enumeration-like behaviour using int-constants. Or worse: String constants. The java.util.Calendar-class serves as a great example for this former best practice, before the Enumeration-Type was introduced with Java release 1.5.
PS: OSCache is under the OpenSymphony Software License, Version 1.1 which is derived and fully compatible with the Apache Software License.
Simply thinking in terms of man-days is not too bad. If estimated properly the project will cover your costs and maybe leave you some profit on top. But imagine you can finish a complex project in a short amount of time, because you already have this great component youve written in a previous project that you can use for this one, too? Ask yourself: how much is it worth? How much would others charge for the same project?
Lets ce it: we hate writing proposals. Were engineers and we want to do what we do best: write code, design great architectures, try out new technologies, stuff like that. Nevertheless proposals are extremely important: no proposal – no project – no work – no pay – no doughnuts.
MARCH, , ,
FEBRUARY, , ,
of course the GPS module is not 100% accurate. So even if you do not move,new york asian escort the collected geolcations will be spread over an area of some square meters. In order to compensate the effect I made sure the location is only persisted in case the new position is at least 10m away from the previous position
As the scrum product owner of the german Telefonica online shop I needed a backlog of 25 stories estimated quickly for an upcoming project I had one hour. So I researched estimation methods that would eventually enable me to do so. With our usual approach of traditional planning poker and discussing and refining stories in the process, I would have missed that goal grossly as it usually takes us 10-15 minutes for estimating a mid sized story.
JANUARY, , ,
localStorage.;Important to know: if you want to store object data youll need to convert it to a string first. JSON.stringify(object) does the job perfectly. For using a serialized object later you can simply call JSON.parse(object)
cal., ;Ive never seen this done before, but looking at it, I must say it really hurts.
The result can be seen here it works well with iOS6, I havent tested it with any other mobile operating systems.
See this infografic for more details:
Here are some of the learnings I got from this little project
. = index;
the team should be experienced in planning poker and have a mutual understanding of complexity and effort
Interesting quote, isnt it? Its from Black Eyed Peas creator will.i.am and I found it in this great video:
A cache with an invalidation timeout as seen in the above example is great for many situations, but sometimes you need full control on when a cache entry needs invalidating. OSCache offers an API to manage the cache in your Java code. This is an example of how to invalidate it in a Java web application:
show places nearby and calculate the distance to them. The data for the places was taken from
These are my top 10 learnings of the last four years as a product owner.
So before using the brute force approach by throwing more hardware at the problem, the most important task to accomplish first is to find the real bottleneck. Just like in war times good intelligence is your key to winning the battle. So gather information first.
Find out which parts are slow and under which circumstances the performance is poor. Talking to actual users of the app is a good approach to do so.
ServletContext context = httpServletRequest..;
Is there anything Ive forgotten? Let me know and leave a comment Ill appreciate it.
Check the DB for the most frequently executed queries if a query is executed very often this might be a place where the application code needs optimizing or where caching might help. Add caching wherever the same piece of infrequently changing data is shown to many users many times. A great roundup on open source Java cache implementations can be found here.
Content to be cached
One part of our DOD (Definition of Done) is a successful peer review. In this peer review a team member who was not involved in implementing the story tests the result from a customer perspective, checks if the code matches the coding guidelines and makes sure the tests make sense on unit- , integration and UI-level. If necessary bugs are fixed or code is rectored. The quality of our releases has improved significantly after we have introduced peer reviews.
Always have someone else check your proposal. Never send a proposal to a customer, no one else has taken a good look at. Ask someone to check the proposal critically, question everything from the concept down to the pricing. The resulting proposal will contain less typos and someone else might find something significant you might have forgotten or overlooked. Maybe someone else will think its too cheap, too expensive, lacking detail or whatever.
And heres an example of how the enumeration can be used:
Especially in times like these, where every customer seems to be cutting back costs, we should be happy about any request for a proposal that comes in. And with this positive attitude our proposals will get a lot better. The customer is our friend. We need her more desperately than the she needs us.
Check the Database for slow queries most databases provide tools and statistics to determine the slowest queries. This will help you find out where indexes might be missing or which queries need optimizing
An excellent, widely used open source cache solution which is easy to use and yet powerful is OSCache ( Besides features like clustering, a servlet filter for caching entire JSP pages or persistent caching it comes with a JSP tag library that enables you to include caching into your jsp based web application so easily it hurts.
In order to learn something new its always a good idea to read up on the topic. But that doesnt make you an expert. So I started a little demo project using various html5 related features. I called it „Geotracer and it was inspired by the app „Runtastic that I love using on my iPhone. So what does it do?
I was really amazed how the api really is. Geotracer stores all collected geolocations locally, so that you can navigate to another page, come back and your data is still available. The local storage API consists of 4 methods, no need for further explanation:
The performance of a dynamic web application can be quite unpredictable when you dont know how many People are going to use it and of course how they are going to use it. You can predict some of the users behaviours and do your best to prepare your application to cope with the expected load. But sometime after the launch you suddenly find yourself in a situation where the performance of your application or at least parts of it is poor and the customer is unhappy. In cases like this typical reasons why you didnt find the bottlenecks while developing are:
cache.keyPiece of cake!
Bugs are a pain in the ass for everyone: the customers, the business units, development, operations. Whenever a bug is reported, decide whether its super urgent (e.g. when it impacts customers) or not. Urgent bugs need to be fixed quickly and operations should deploy the fix asap. When bugs are taken care of, the rest of the team can focus on finishing the sprint. Automated builds and scripted deployments are key to success.
An excellent piece of literature on this topic is Scalable Internet Architectures by Theo Schlossnagle
In this example the cached portion of the page is stored under the key defined in the variable cacheKey, it supports multiple languages and expires after 1800 seconds. There are a few other attributes available for configuring the cache tag. More information can be found here
Querying a database makes much sense when the data requested changes a lot. But imagine the database is backing a blog or news website where the data requested from the database is the same in hundreds or even thousands of cases. The most frequent query sent to the database in such an environment is probably for loading the article on page one, which once published probably wont change a lot. This doesnt hurt the Database if your private blog has 100 unique visitors per day, but if the frontpage of a popular news website is attacked by 100.000 unique visitors per hour then you are in trouble. You need to use caching in order to take away stress from your database server.
Back in 1984 when I started coding on my first computer, a Sinclair ZX81 with 1kByte of RAM (which I soon upgraded to 16 which back then seemed massive), coding wasnt cool at all. Good to see that finally people appreciate that programmers are adding value.
If its not completely clear what the customer wants and what the desired outcome of the project will be, youre walking on thin ice with a proposal. In that case its often better to name ballpark numbers and ranges instead of a fixed price.
When I started working as a product owner for the online shop at Telefnica Germany (also known as o2) in 2009, Scrum had already been established in the portal development unit. During the last four years the way me and my fellow product owners work has changed and matured significantly. And I think this is part of the magic of Scrum: always trying to get better, questioning the way you work and constantly improving things that need fixing (this is why retrospectives are so important).
myDate = cal.;This has been a clean way of implementing and imitating enum-like behaviour in pre 1.5 times and of course in projects that require a lower java version.
It was fun to implement this little project. And while working on it I continuously found other areas I want to dig into, such as the already mentioned web workers or CSS3.
If all this brain doesnt solve the problem you might need to add muscle to your hardware:
ServletCacheAdministrator admin = ServletCacheAdministrator.context;
4) Cover your back
But if you do so, do not try to influence the sprint. Trust the teams self organizing power. Simply listen and be helpful. After the team is finished with its topics I usually give updates on whats happening in the company. Almost every day they ask questions concerning the stories they are currently working on, so its a perfect opportunity to clarify things after the standup meeting and before they dive into their workday.
Cache cache = admin.context;
Every project contains risks. Think about worst case scenarios and everything that could go wrong during the project e.g. introducing a new technology you havent worked with before. The more risks you find, the more buffer you add to the price. Sometimes it even makes sense to mention the risks and the customer will better understand the pricing.
DECEMBER, , ;
One of the keys to successful scrum is to keep pressure away from the team. In the end youll be rewarded with happy team members and top notch quality of your product. The team commits to the scope of the sprint, so do not try to squeeze in more. As the product owner, I am in a different situation I have many stakeholders who contribute topics to my backlog and who provide budget for the implementation. It sometimes feels like playing Tetris fitting in every little story or even bigger projects into the release planning. Knowing the velocity of your team, its capacity (number of person days available during a sprint) and having an estimated and groomed backlog enables you to predict quite well when a story will be released. If you cant commit to a delivery date, just say no.
Imagine you want to get a java.util.Date object pointing to the 1st of January 2009, midnight. This is one way of doing it:
After 30 minutes the team was happy with the setting, the position of the cards was stable and I had the complete backlog estimated.
When I started working here in 2009, the backlogs as well as the sprint task boards were organized in Jira/Greenhopper. During the daily scrums a laptop was connected to a beamer, the team members reported what they had achieved the previous day and what they were planning to do today. They even reported hours worked on a task. The scrum master then fiddled around with the mouse, moving digital post-it notes around on the computer. They all hated it. And so we got rid of it. We use Jira for documenting user stories and I use the agile module for prioritizing my backlogs only. The task board is 100% analog and consists of sticky notes on a wall. We use different colours for tasks, bugs, impediments and user stories. The user stories have the JIRA ID on them, so any comments, questions and changes can be documented in the system.
ZTD is lightweight. It consists of 10 habits and the author asks you to work on the habits one at a time, and focussing to adapt it in say a month. Every habit improves your productivity.
There is a lot of truth in here. Software has become part of so many aspects of our lives. We take it for granted. Were constantly twiddling with our smartphones, mostly with apps or mobile websites that are really adding value to our lives (more or less). Our TVs become smarter with software. Our car tells us where to go or how to avoid traffic jams. I could go on forever.
This is my personal view on things of course. Sure enough, not everything we do is done according to the book. But it works well for us and the output of the team is appreciated very much by all the stakeholders. Hopefully you found something here that might help you, too.
The day before the estimation I asked the team to prepare by reading the backlog on the confluence page and by reading a blog post explaining the concept of magic estimation that I thought was useful.
We have always encouraged the team members not to specialize too much in a specific area. Have a frontend developer implement a backend service. Let a backend guy build a GUI even if it takes longer. Have the team members take turns doing the sprint review, so they can all work on their presentation skills. Holidays and sickness wont hurt you that much if any story can be implemented by any member of the team.
The first habit I am now working on is organize. Example: I used to gather incoming mail in an inbox, of course processing stuff like bills to pay immediately, but I didnt file it right away. What I did instead was letting the stuff pile up for half a year and then wasting two hours, putting it into the appropriate files. I now started filing stuff immediately I go shopping and bring back receipts for products that I want to keep in case I need them for warranty purposes I file them immediately. Takes one minute. The bank sends a new bank statement I file it immediately. Simply put stuff where it belongs. If you dont know where to put stuff, find a home for it. I like that metaphor a lot, Leo Babauta uses in his book.
The next habit Im going to work on after I have adopted the first is collect. I have a good system for collecting stuff at work, but this is only one part of my life. Stuff I need to look after at home is either stored in my brain or my wife tells me what to do. So there is a lot of room for improvement. And simplification.
Soon after I took over the online shop team we established weekly backlog grooming meetings where the upcoming stories were discussed and estimated. In many cases the team had much better solutions for stories than I or my peers from online marketing had in mind. The team adds value. We use the meeting to discuss rough requirements and detail them out together. Avoid bringing a story completely unknown to the team into the sprint planning as it will dramatically lengthen it depending on the complexity.
While we were organized in cross functional teams in the early agile years (2006-2010), we have moved to component teams responsible for one application each, such as the online shop, the selfcare portal or the companys SSO-application. If a team is fully responsible for an application, theyll establish a feeling of ownership for it. When there is a bug they wont be trying to blame someone else, instead their pride will make them fix it asap. As I already mentioned previously, encourage your developers to be cross functional whithin the team. The quality of the source code and the SLA compliance of our portal applications have increased significantly after we switched from cross functional teams to component teams responsible for only one product.
While listening, my first impression was that this is more or less a copy of GTD principles but then I started liking it a lot. The magic of Zen to done is the simplicity behind it. I read GTD a couple of years ago and wrote about it. I even started applying the principles to my life. But I soon found out, that its not easy to adapt. GTD is not complicated, but it requires a lot of discipline. It focuses on collecting and organising your tasks and projects, list writing and constantly reviewing the stuff youve gathered.
For calculating the distance between two points I used the Haversine-Formula. The implementation I used comes from here:
MonthEnum name, index, numberOfDays
cal.., ;And due to the ct that the number of the months in the Calendar class starts with 0 this would create a Date object pointing to the 1st of February. Ouch. An even more evil way of misusing the Calendar class could be this:
Since the release of Java 1.5 there is a much better way of programming that kind of behaviour using the Enumeration type. This is how a Month enumeration could look like:
cal = .;
All you have to do is:
I already had a rough version of the backlog put together on a confluence page as a draft, which I would eventually move into Jira. It consisted of the user story descriptions (e.g. „as a customer I want to X in order to Y) and some bullet points for better describing the objective of that particular story. I printed the page and cut it into slices so that every story was available as a strip of . Then I glued these onto Post-it notes.
So here are my rules for writing a good proposal:
Use a profiler to find out where in your code the application gets stuck. Chances are high that you end up locating the place where one of the slow queries is executed
Then start optimizing the parts you expect the most performance boost from. Be careful though when adding indexes on database tables with huge amounts of data check if there is sufficient disk/table space available on the RDBMS. Indexes can also have effects on the performance of write operations.