1. Plan: Control what is going to achieve;
2. Resource: Have your own resource which is in full control according to the plan;
3. Monitor: Have way or tool to monitor the activities; Get big pictures or details of the on going status;
4. Control: Can adjust or change the target or resource allocation as the circumstance changes.
Wednesday, 19 December 2012
Wednesday, 5 December 2012
How to judge one guy can handle multi task well?
Multi-task process means one can process many tasks in parallel. And it is important to see if those tasks are processed in a raw and step-by-step checking, it is impossible to finish!
Questions:
Can you describe one of your typical working day? What kind of things are involved?
Try to catch what the interviewer does in one normal day. Check if it involves multiple tasks or just focus on one or two things. if it is in multiprocessing, try to figure out the workload, whether it is impossible to complete the tasks!
So how to do if it is impossible to handle a over-loaded job?
1. Check the task priority whether it is critical.
Questions:
If u were receiving many questions and help from the customers at the same moment, and everyone claim it is critical. How to response?
Get back a response and have a sense to rate the severity. Test one person's estimation about the priority of the task.
2. Check who the owner is.
He may not know how to tackle the issue, but he knows who can do that.
3. If the owner is himself, try to figure out what the status is and what the available resource he has. For example, what are the environment parameters? any available or backup environment? What is the current conclusion? Any other backup person can do that?
4. If it cannot be done, discuss with the stakeholders. For example, what the impact is, and why it is important. Any work around solution? Discuss the further plan, task scope and delivery date with reasonable steps. Manage the expectation and make sure it keeps on progress.
5. Should have some sort of mean to keep track of tasks.
Questions:
How do you make sure all the customers' requests won't be missing?
Excel, sophisticate software ... but check if one guy can use tools to help manage tasks.
Questions:
Can you describe one of your typical working day? What kind of things are involved?
Try to catch what the interviewer does in one normal day. Check if it involves multiple tasks or just focus on one or two things. if it is in multiprocessing, try to figure out the workload, whether it is impossible to complete the tasks!
So how to do if it is impossible to handle a over-loaded job?
1. Check the task priority whether it is critical.
Questions:
If u were receiving many questions and help from the customers at the same moment, and everyone claim it is critical. How to response?
Get back a response and have a sense to rate the severity. Test one person's estimation about the priority of the task.
2. Check who the owner is.
He may not know how to tackle the issue, but he knows who can do that.
3. If the owner is himself, try to figure out what the status is and what the available resource he has. For example, what are the environment parameters? any available or backup environment? What is the current conclusion? Any other backup person can do that?
4. If it cannot be done, discuss with the stakeholders. For example, what the impact is, and why it is important. Any work around solution? Discuss the further plan, task scope and delivery date with reasonable steps. Manage the expectation and make sure it keeps on progress.
5. Should have some sort of mean to keep track of tasks.
Questions:
How do you make sure all the customers' requests won't be missing?
Excel, sophisticate software ... but check if one guy can use tools to help manage tasks.
Monday, 22 October 2012
Some open source library
qpid: Message Bus
http://qpid.apache.org/
openfix: fix
http://www.openfix.org/
http://qpid.apache.org/
openfix: fix
http://www.openfix.org/
Wednesday, 19 September 2012
One design example: base class and template
The problem is: There are some math expressions, which have +/-/*// operators. But they can be implemented in different math libraries. And different math libraries implementation cannot be calculated directly. How to design the expression classes?
Design by having a base class:
class Expr;
class LPExpr: public Expr
{
operate();
};
class XXExpr: public Expr
{
operate();
};
Expr operator+(const Expr&, const Expr&);
The difficulty is, in operator+, since they may be in different implementation, it may need to open up some common interface in Expr. But somtimes, the value needs a specific class type interface to retrieve.
By Template:
The below implementation is done by template. it can solve the problem of different types of expressions calculations because the implementation is done in template specialization, no need to be defined in definitions. The design defines almost the thinnest interface for expressions. What we want are, the class name and the operators only. Especially, it is suitable for the operations implementations between base classes.
class LPType;
class XXType;
template<class T>
class Expr;
template<class T>
class Factory
{
public:
Expr<T> * create();
};
template<class T>
Expr<T> operator+(const Expr<T>&, const Expr<T> &);
template<>
class Expr<LPType>
{
public:
Expr()
{
cout << "Expr() LPType" << endl;;
}
private:
int m_env;
};
template<>
class Factory<LPType>
{
public:
Expr<LPType>* create()
{
cout << "creating expr LPType" << endl;
return new Expr<LPType>();
}
};
template<>
Expr<LPType> operator+(const Expr<LPType>&, const Expr<LPType> &)
{
Expr<LPType> lpType;
cout << "operator+ LPType";
lpType.m_env;
return lpType;
}
template<>
class Expr<XXType>
{
public:
Expr()
{
cout << "Expr() XXType" << endl;;
}
};
template<>
class Factory<XXType>
{
public:
Expr<XXType>* create()
{
cout << "creating expr XXType" << endl;
return new Expr<XXType>();
}
};
template<>
Expr<XXType> operator+(const Expr<XXType>&, const Expr<XXType> &)
{
Expr<XXType> lpType;
cout << "operator+ XXType";
return lpType;
}
int main()
{
Factory<LPType> lpFactory;
Expr<LPType>* lpType1 = lpFactory.create();
Expr<LPType>* lpType2 = lpFactory.create();
*lpType1 + *lpType2;
Factory<XXType> xxFactory;
Expr<XXType>* xxType1 = xxFactory.create();
*lpType1 + *xxType1; // cannot compiled
return 0;
}
Design by having a base class:
class Expr;
class LPExpr: public Expr
{
operate();
};
class XXExpr: public Expr
{
operate();
};
Expr operator+(const Expr&, const Expr&);
The difficulty is, in operator+, since they may be in different implementation, it may need to open up some common interface in Expr. But somtimes, the value needs a specific class type interface to retrieve.
By Template:
The below implementation is done by template. it can solve the problem of different types of expressions calculations because the implementation is done in template specialization, no need to be defined in definitions. The design defines almost the thinnest interface for expressions. What we want are, the class name and the operators only. Especially, it is suitable for the operations implementations between base classes.
class LPType;
class XXType;
template<class T>
class Expr;
template<class T>
class Factory
{
public:
Expr<T> * create();
};
template<class T>
Expr<T> operator+(const Expr<T>&, const Expr<T> &);
template<>
class Expr<LPType>
{
public:
Expr()
{
cout << "Expr() LPType" << endl;;
}
private:
int m_env;
};
template<>
class Factory<LPType>
{
public:
Expr<LPType>* create()
{
cout << "creating expr LPType" << endl;
return new Expr<LPType>();
}
};
template<>
Expr<LPType> operator+(const Expr<LPType>&, const Expr<LPType> &)
{
Expr<LPType> lpType;
cout << "operator+ LPType";
lpType.m_env;
return lpType;
}
template<>
class Expr<XXType>
{
public:
Expr()
{
cout << "Expr() XXType" << endl;;
}
};
template<>
class Factory<XXType>
{
public:
Expr<XXType>* create()
{
cout << "creating expr XXType" << endl;
return new Expr<XXType>();
}
};
template<>
Expr<XXType> operator+(const Expr<XXType>&, const Expr<XXType> &)
{
Expr<XXType> lpType;
cout << "operator+ XXType";
return lpType;
}
int main()
{
Factory<LPType> lpFactory;
Expr<LPType>* lpType1 = lpFactory.create();
Expr<LPType>* lpType2 = lpFactory.create();
*lpType1 + *lpType2;
Factory<XXType> xxFactory;
Expr<XXType>* xxType1 = xxFactory.create();
*lpType1 + *xxType1; // cannot compiled
return 0;
}
Thursday, 6 September 2012
why BOOST_STRONG_TYPEDEF?
The source code below:
template<>
ROKeyIndex2 updateIndex<ROKeyIndex2, ROKeyIndex>(const ROKeyIndex& keyIndex)
{
ROKeyIndex2 index2(keyIndex, 0);
return index2;
}
template<>
ROKeyIndex2 updateIndex<ROKeyIndex2, ROUnIndex>(const ROUnIndex& keyIndex)
{
ROKeyIndex2 index2(0, keyIndex);
return index2;
}
It uses template specialization to differentiate two kinds of implementation.
However, since they are in the same type int,
typedef int ROKeyIndex;
typedef int ROUnIndex;
In VS2010, it will report duplicated implementations in linking phase.
But they are really in different meaning in application level except they are defined in the same type.
How to solve?
by using strong_typedef, it will force them to be in different types, which makes those template specialization functions be different.
#include <boost/strong_typedef.hpp>
BOOST_STRONG_TYPEDEF(int, ROVarIndex);
BOOST_STRONG_TYPEDEF(int, ROUnIndex);
In the boost header file,
template<>
ROKeyIndex2 updateIndex<ROKeyIndex2, ROKeyIndex>(const ROKeyIndex& keyIndex)
{
ROKeyIndex2 index2(keyIndex, 0);
return index2;
}
template<>
ROKeyIndex2 updateIndex<ROKeyIndex2, ROUnIndex>(const ROUnIndex& keyIndex)
{
ROKeyIndex2 index2(0, keyIndex);
return index2;
}
It uses template specialization to differentiate two kinds of implementation.
However, since they are in the same type int,
typedef int ROKeyIndex;
typedef int ROUnIndex;
In VS2010, it will report duplicated implementations in linking phase.
But they are really in different meaning in application level except they are defined in the same type.
How to solve?
by using strong_typedef, it will force them to be in different types, which makes those template specialization functions be different.
#include <boost/strong_typedef.hpp>
BOOST_STRONG_TYPEDEF(int, ROVarIndex);
BOOST_STRONG_TYPEDEF(int, ROUnIndex);
In the boost header file,
explicit D(const T t_) : t(t_) {};
Wednesday, 5 September 2012
QT QObject usage and QT Makefile genereation on Linux
To use the QT Signal/Slot mechanism, sometimes you may want to make your classes to be subclasses of QObject.
It should be straight forward to inherit from QObject class and use marcro QObject to achieve the ability of QObject.
Note: The inherited QObject should be defined in a separate header file and cannot be defined in cpp. Because QT will generate some mock files by the existing header files, and those mock files may contain some QObject function implementations.
And for QT Makefile generation on Linux, the command is
$(QT_PATH)/bin/qmake -spec $(QT_PATH)/mkspecs/linux-g++ -o Makefile.linux proj.pro.
And proj.pro can be generated by QTCreator.
It should be straight forward to inherit from QObject class and use marcro QObject to achieve the ability of QObject.
Note: The inherited QObject should be defined in a separate header file and cannot be defined in cpp. Because QT will generate some mock files by the existing header files, and those mock files may contain some QObject function implementations.
And for QT Makefile generation on Linux, the command is
$(QT_PATH)/bin/qmake -spec $(QT_PATH)/mkspecs/linux-g++ -o Makefile.linux proj.pro.
And proj.pro can be generated by QTCreator.
One way to access internal server
One case, Internal server is deployed in one Data Center and it is behind firewall and has internal IP address.
Besides using NAT, if the internal server can access to Internet, we can use some application layer remote control software to control it.
Besides using NAT, if the internal server can access to Internet, we can use some application layer remote control software to control it.
Wednesday, 22 August 2012
Some thoughts about Evaluation of Advanced Software and Tech Dev Investment
Advanced Software and Tech is always benefit to the company and every one are aware of that. But the manager's questions are always: How good it is? What is the Cost? Can it bring revenue or save cost? Worth to invest?
The Cost is relatively easy to measure if the license fee is certain and the development period estimation is kind of accuracy.
Take an commercial or development plan of an advanced automation test tool for example,
The benefit to a Software Company may be:
1. Reduce the number of bugs found and unfound.
bugs found: bug avg analysis time; bug fixed time; Sanity Test or Regression Test time; Redeployment time; Employee Salary.
Bugs unfounded: can be defined found by customers. The impact may be: Halted production time hence take the lost revenue as cost; Brand loyalty, hard to measure but maybe we can define a concept like: One customer will stop using the product completely if he find 10 significant bugs in run time. So one significant bug cost is worth 10% of revenue generated by one customer .
2. Reduce the regression test time. Just consider the saving time and the employee salary.
3. If a tool is self-developed, we may need to consider the depreciation period. For example, we can assume the tool will be totally deprecated after 10 years. It is possible because the technology may be outdated, or the maintenance cost is uncontrolled increasing due to bad design or changing dev and support guys or others.
Anyway, even though hard to quantization, data is more more reliable and supportive to decide to invest a new product. And it is better that each quantitative factor is specific, which means understandable and measurable. For those data which is hard to measured, can be decided by experts, engineers and managers discussion.
The Cost is relatively easy to measure if the license fee is certain and the development period estimation is kind of accuracy.
Take an commercial or development plan of an advanced automation test tool for example,
The benefit to a Software Company may be:
1. Reduce the number of bugs found and unfound.
bugs found: bug avg analysis time; bug fixed time; Sanity Test or Regression Test time; Redeployment time; Employee Salary.
Bugs unfounded: can be defined found by customers. The impact may be: Halted production time hence take the lost revenue as cost; Brand loyalty, hard to measure but maybe we can define a concept like: One customer will stop using the product completely if he find 10 significant bugs in run time. So one significant bug cost is worth 10% of revenue generated by one customer .
2. Reduce the regression test time. Just consider the saving time and the employee salary.
3. If a tool is self-developed, we may need to consider the depreciation period. For example, we can assume the tool will be totally deprecated after 10 years. It is possible because the technology may be outdated, or the maintenance cost is uncontrolled increasing due to bad design or changing dev and support guys or others.
Anyway, even though hard to quantization, data is more more reliable and supportive to decide to invest a new product. And it is better that each quantitative factor is specific, which means understandable and measurable. For those data which is hard to measured, can be decided by experts, engineers and managers discussion.
boost::split string split algo
Today just check how a url is parsed into several components.
std::vector< std::string > tokens;
boost::split( tokens, URL, boost::is_any_of( ":/" ));
It is very simple and straightforward way to implement the functions.
much better than istringstream.getline used before.
char tmp[128];
istringstream stream(str.c_str());
stream.getline(tmp, MAX_ATTRIBUTE_LEN, delimiter);
Also check the boost website
http://www.boost.org/doc/libs/1_49_0/doc/html/string_algo/usage.html
such like case conversion and trim are there.
std::vector< std::string > tokens;
boost::split( tokens, URL, boost::is_any_of( ":/" ));
It is very simple and straightforward way to implement the functions.
much better than istringstream.getline used before.
char tmp[128];
istringstream stream(str.c_str());
stream.getline(tmp, MAX_ATTRIBUTE_LEN, delimiter);
Also check the boost website
http://www.boost.org/doc/libs/1_49_0/doc/html/string_algo/usage.html
such like case conversion and trim are there.
string str1("HeLlO WoRld!");
to_upper(str1); // str1=="HELLO WORLD!"
string str1=" hello world! ";
string str2=trim_left_copy(str1); // str2 == "hello world! "
string str3=trim_right_copy(str1); // str3 == " hello world!"
trim(str1); // str1 == "hello world!"
It is cool. Don't know the performance now but let it there
unless it is the bottleneck of the whole application. I believe it won't be recently.
Thursday, 16 August 2012
boost regex usage
Good thing in C++.
Just define your regular expression, and put a string to check if it matches.
for example:
boost::regex pureNumberReg("(^[1-9]+[0-9]*)|(^(([1-9]+)|([0-9]+\.[0-9]{1,}))$)");
return boost::regex_match(value,pureNumberReg);
Easy.
But on windows, it may have some link error message for MD, MT things.
By using BOOST_ALL_NO_LIB, it will force boost won't import the library during compilation.
Just define your regular expression, and put a string to check if it matches.
for example:
boost::regex pureNumberReg("(^[1-9]+[0-9]*)|(^(([1-9]+)|([0-9]+\.[0-9]{1,}))$)");
return boost::regex_match(value,pureNumberReg);
Easy.
But on windows, it may have some link error message for MD, MT things.
By using BOOST_ALL_NO_LIB, it will force boost won't import the library during compilation.
R with Database
Easy to do by installing RODBC.
After configuring ODBC driver, then from R console, enter
library(RODBC)
myconn <-odbcConnect("Test", uid="root", pwd="root")
dt <- sqlQuery(myconn, "select * from test")
close(myconn)
enjoy the output result dt from database!
After configuring ODBC driver, then from R console, enter
library(RODBC)
myconn <-odbcConnect("Test", uid="root", pwd="root")
dt <- sqlQuery(myconn, "select * from test")
close(myconn)
enjoy the output result dt from database!
Friday, 27 July 2012
Specialist vs. Eclectic(1)
It actually takes from one agile expert chenyong's blog.But it is in Chinese.
http://blog.csdn.net/cheny_com/article/details/7717787
Just write down some of his options.
For Eclectic: Some body claims he can use 7 or 8 computer languages, involving in 76 projects.You will doubt whether he knows the project well enough.
For Expert: Someone maybe focus on one document translator for ten years but beyond that, he knows nothing.
Which one is better? Actually, none of them is good.
How to become a good programmer?
Good programmer likes to communicate with others and learn from others.
If one programmer needs to touch with fresh man, he need to write the code clearly and let the new guy easy to read.
If he needs to work with senior programmers, he needs to make the code elegant enough.
For the knowledge growing, First, he may need to communicate in technical point of view, then need to understand the domain services, after that knowledge transfer. Day by day, he will become a Eclectic.
Some one worries if he knows too much, then he will lost his specialty.
Two gaps in software engineering:
1. GUI and backend Server;
Actually it is very difficult to separate them out completely. If you can design a product both GUI and backend in a big picture, you will achieve a good quality of product.
2. Development and QA.
Developer writes auto test code for QA to learn the overall picture of product; Developer reviews the QA test cases to learn the business logic.
(My understand: So, try to understand the thing in a high level, in a big picture. No need to be so constraint by the role. For example, if I am a developer, I don't like to say I am a developer purely. Rather, I will say I am a member of solution provider, and mainly focus on good quality of source code. That means, I am still responsible for the final delivery quality of the whole product. I won't miss understand the customer's requirement. It is not only the pre-sale's job. )
http://blog.csdn.net/cheny_com/article/details/7717787
Just write down some of his options.
For Eclectic: Some body claims he can use 7 or 8 computer languages, involving in 76 projects.You will doubt whether he knows the project well enough.
For Expert: Someone maybe focus on one document translator for ten years but beyond that, he knows nothing.
Which one is better? Actually, none of them is good.
How to become a good programmer?
Good programmer likes to communicate with others and learn from others.
If one programmer needs to touch with fresh man, he need to write the code clearly and let the new guy easy to read.
If he needs to work with senior programmers, he needs to make the code elegant enough.
For the knowledge growing, First, he may need to communicate in technical point of view, then need to understand the domain services, after that knowledge transfer. Day by day, he will become a Eclectic.
Some one worries if he knows too much, then he will lost his specialty.
Two gaps in software engineering:
1. GUI and backend Server;
Actually it is very difficult to separate them out completely. If you can design a product both GUI and backend in a big picture, you will achieve a good quality of product.
2. Development and QA.
Developer writes auto test code for QA to learn the overall picture of product; Developer reviews the QA test cases to learn the business logic.
(My understand: So, try to understand the thing in a high level, in a big picture. No need to be so constraint by the role. For example, if I am a developer, I don't like to say I am a developer purely. Rather, I will say I am a member of solution provider, and mainly focus on good quality of source code. That means, I am still responsible for the final delivery quality of the whole product. I won't miss understand the customer's requirement. It is not only the pre-sale's job. )
How to integrate a socket check with QT intgeration
In socket programming, you may want to call select to check which sockets is available. Normally, it is called inside a loop.
But in QT GUI programming, the main loop is encapsulated inside application.exec(). See in below:
int main(argc, argv)
{
QApplication a(argc, argv);
return a.exec();
}
You need to find a way to put your select operation in the loop. How to do?
What I found is,
we may use class QAbstractEventDispatcher to register our own SocketNotifier.
You tell QT framework please pay attention to my SocketNotifier. The SocketNotifier has a parameter of fd, which is your own socket one.
I suspect inside QT framework loop may call select implicitly, which supports the integration of the socket programming.
I haven't checked yet, hope it is a right way to do that. I think It should be the correct direction to integrate the socket programming.
If thinking in a more broad way, we can use this mechanism to integrate any data access operation into QT application. For example, look at the Unix, it use fd to abstract file and socket access. You can also define your data access system with a fd as a key to access.
But in QT GUI programming, the main loop is encapsulated inside application.exec(). See in below:
int main(argc, argv)
{
QApplication a(argc, argv);
return a.exec();
}
You need to find a way to put your select operation in the loop. How to do?
What I found is,
we may use class QAbstractEventDispatcher to register our own SocketNotifier.
You tell QT framework please pay attention to my SocketNotifier. The SocketNotifier has a parameter of fd, which is your own socket one.
I suspect inside QT framework loop may call select implicitly, which supports the integration of the socket programming.
I haven't checked yet, hope it is a right way to do that. I think It should be the correct direction to integrate the socket programming.
If thinking in a more broad way, we can use this mechanism to integrate any data access operation into QT application. For example, look at the Unix, it use fd to abstract file and socket access. You can also define your data access system with a fd as a key to access.
Third Party Library Visual Studio Version Dependence
Today I imported a
self-development library on Windows, but when the program just calls a
simple entry API of that library, the program crashes.
Finally, what I found is, this library depends on one open source third party library, whose the highest library version is, Visual Studio 2005 in official download website . But my current Visual Studio is 2010, and it will conflict! That means you need to take the open source by yourself and recompile the library!!
I don't want to do that because I don't want to be the maintenance developer of the library, so I choose a new version third party library which provides Visual Studio 2010 libraries download. But it fails again. And I checked again, our self-development library including path already hard coding the third party version, which means you cannot upgrade to the new version of third party if you want to use the self-development library!!
It seems it is a joke for Visual Studio backward compatibility, so if you want to develop a new library, don't depend on certain version of third party. The dependence should only contains the component name, and it should not contains any kind of version!
Finally, what I found is, this library depends on one open source third party library, whose the highest library version is, Visual Studio 2005 in official download website . But my current Visual Studio is 2010, and it will conflict! That means you need to take the open source by yourself and recompile the library!!
I don't want to do that because I don't want to be the maintenance developer of the library, so I choose a new version third party library which provides Visual Studio 2010 libraries download. But it fails again. And I checked again, our self-development library including path already hard coding the third party version, which means you cannot upgrade to the new version of third party if you want to use the self-development library!!
It seems it is a joke for Visual Studio backward compatibility, so if you want to develop a new library, don't depend on certain version of third party. The dependence should only contains the component name, and it should not contains any kind of version!
Big Company VS Small Company
When there are lots of stories about creating or selling their own small
company to become millionaire, I've seen somebody in big company
complains no room, lots of processes, lots of communications, hard to do
whatever he wants.
My opinion is, the management and process in big company is a must
. 1.It is so big that no easy to see in big picture. there should be some effort to maintain a communication channel.
2.since a company knows it is not easy to pass the first survival stage, it should have some sort of control to keep it grows. Not like small company, no much background and burden, just go fast and go ahead, maybe more aggressive.
3. In big picture, there is a rule in
Mmmkeconomics the incoming per unit will decay as the company is becoming larger.
My opinion is, the management and process in big company is a must
. 1.It is so big that no easy to see in big picture. there should be some effort to maintain a communication channel.
2.since a company knows it is not easy to pass the first survival stage, it should have some sort of control to keep it grows. Not like small company, no much background and burden, just go fast and go ahead, maybe more aggressive.
3. In big picture, there is a rule in
Mmmkeconomics the incoming per unit will decay as the company is becoming larger.
About Software Design
it is argued again and again.
What I think is, each component is so thin and simple that can be easily put together as a whole. They can be tested very easy and a so-call state of art software is like a tool you can extend in any way you want.
Any time it will argue about the implementation is not enough oriented design, a bit slower or the design is too complicated.
To me, it is a matter of methodology and personal preference.I understand each method will always have its advantage and drawback.
But the golden principle must be remembered is, as a programmer, you must deliver correctness, easy maintenance and enough performance in time! Otherwise, rubbish...
So at the design stage, we should focus:
1. how to make sure it is 99% correctness after delivered?
Always ask: Requirements are well understood?anything missing? Enough resource to Test? Easy to Test?
2. How to make it easy to maintain?
Each part is easy to understand? Easy to divide? Easy to put them together like a tool? What is the potential extension for future development? Requirements and Features are apparent enough? Well organized or have a layer concept(Look at the army or a big company how they are organized)?
3.good enough performance
What is the estimated and required performance in normal transaction? Do you understand the algorithm? Do you know the performance stat or try for each operation(assignment, function call, virtual call..)? What is the bottle neck? If want to talk about performance, please provide the stat data before discussion.
4. deliver in time
Have you break down the requirement detail enough how to implement in your mind? If cannot, please continue. It is the basis of project scope estimation. Try to use your experience, or FPA(Function Point Analysis, somebody suggests but I don't pratice) to estimate the time. Find a good tool to help you to consider the factor of holiday or effort percentage. OpenProj may be a free and good enough choice. If project progress falls behind the schedule, can you notice it in advance? Can you control? If cannot, ask yourself why cannot and what is the reason of that. Keep on communication and let the stakeholder know the status in time. Nobody will like to be surprised finally!
So, I don't care how it is implemented if all the above are satisfied.
What I think is, each component is so thin and simple that can be easily put together as a whole. They can be tested very easy and a so-call state of art software is like a tool you can extend in any way you want.
Any time it will argue about the implementation is not enough oriented design, a bit slower or the design is too complicated.
To me, it is a matter of methodology and personal preference.I understand each method will always have its advantage and drawback.
But the golden principle must be remembered is, as a programmer, you must deliver correctness, easy maintenance and enough performance in time! Otherwise, rubbish...
So at the design stage, we should focus:
1. how to make sure it is 99% correctness after delivered?
Always ask: Requirements are well understood?anything missing? Enough resource to Test? Easy to Test?
2. How to make it easy to maintain?
Each part is easy to understand? Easy to divide? Easy to put them together like a tool? What is the potential extension for future development? Requirements and Features are apparent enough? Well organized or have a layer concept(Look at the army or a big company how they are organized)?
3.good enough performance
What is the estimated and required performance in normal transaction? Do you understand the algorithm? Do you know the performance stat or try for each operation(assignment, function call, virtual call..)? What is the bottle neck? If want to talk about performance, please provide the stat data before discussion.
4. deliver in time
Have you break down the requirement detail enough how to implement in your mind? If cannot, please continue. It is the basis of project scope estimation. Try to use your experience, or FPA(Function Point Analysis, somebody suggests but I don't pratice) to estimate the time. Find a good tool to help you to consider the factor of holiday or effort percentage. OpenProj may be a free and good enough choice. If project progress falls behind the schedule, can you notice it in advance? Can you control? If cannot, ask yourself why cannot and what is the reason of that. Keep on communication and let the stakeholder know the status in time. Nobody will like to be surprised finally!
So, I don't care how it is implemented if all the above are satisfied.
A Code Farmer
A programmer are usually called as a code farmer in China. Why? Because
a programmer does coding for projects one by one. If the client and the
market doesn't provide the projects, a programmer will have nothing to
do and lost his value. It just like the farmer, whose harvest depends on
a good weather
Subscribe to:
Comments (Atom)