问:
Virtualized Development Environments in Enterprise Networks
We are attempting to implement a development environment using virtualization for a small team of 4 developers within an enterprise organization.  This would allow us to set up separate development, testing, and staging environments - as well as allowing access to new operating systems that are requirements for systems or tools we are evaluating.   We re-purposed an existing workstation-class machine, threw in 24GB RAM and RAID-10, and were doing fine until we attempted to get the machine added to the domain.

Now we are beginning the war that all enterprise developers since the beginning of time have had to fight - the fight for local control of a development and testing environment.  The network and IT admins' have raised concerns ranging from "ESX Server is the enterprise standard" to "servers are not allowed on client VLANs" to "[fill-in-the-blank] is not a skill set currently possessed in the local or enterprise IT organization".

We could justify production-class hardware and formal IT support if we had to, but it would take time and involve a whole lot of headache.  Even then it might take months to formally get IT resources assigned by treating this as a production system - and even if we did, we would likely lose the local control we need.

I imagine that many of you have had similar struggles over developer control of non-production environments - and virtualization in particular - so my questions are as follows:

What strategies and arguments have helped you win over the infrastructure (IT & Network) folks to allow these types of silos to exist within enterprises which have standard network and security policies in place that would generally (and understandably) preclude this type of non-(centrally)-managed infrastructure?

Have you found this to be a matter of technical justification - or more of a political struggle for control and ownership?

If you ended up with a IT-managed development environment, how much of a roadblock has it been for day-to-day development and testing?

Has anyone ended up moving their development environment to a disconnected VLAN or entirely separate network to avoid these network access struggles?

Also, this is not a Hyper-V vs. ESX holy war (we would be fine with either - but Hyper-V was selected since it is "free" with MSDN for these purposes [yes, VMWare has free tools too - but the good management tools generally aren't], and would be easier to manage by the local developers in a "Microsoft Shop") - so arguments for or against either are outside the scope of this question.

This is also less of a virtualization vs. physical hardware - I suppose the same question could be asked without the virtualization component to the equation.

Also assume that the dev team has already made assurances to either manage patch management and antivirus, or integrate with the existing enterprise systems if they will support it.
This scenario, with different questions, is also posted on SF to hopefully elicit the opposing viewpoint.

答:
You will have to make your case with management that:

Having the virtualized environment fulfills one or more of the company's specifically stated requirements (such as the flexibility of supporting multiple platforms), and

You can implement it in a more timely manner, with less cost than IT can, and

Having local control will lower costs and reduce time-to-market delays, and

You can satisfy IT's security and maintenance concerns, and

Programmer productivity will not be affected.

The last one is a big if.   I have discussed this issue with a number of people that specialize in this kind of virtualization.  They tell me that, by the time you throw enough hardware at this to make it as responsive as a local PC, there won't be any hardware cost savings.

So your demonstrated cost savings will have to come in the form of flexibility in configuration, and the ability to change those configurations at a moment's notice.

OwnerDisplayName: ScottBai


问:
Beginning to code with java (No coding experience)

Possible Duplicate:

  Best Java book you have read so far

I want to learn java but, I have absolutely no coding experience.

what is the best website, book, or anything that is best at teaching java?

答:
Java Tutorials are your best resource. Start with "Trails Covering the Basics" and move on to the other tutorials as you see fit.

And of course the Java API for reference:

OwnerDisplayName: Ricky

ContentLicense: CC BY-SA 3.0


答:
Download JAVA, and get into it, that is the best way to learn anything.

When I began learning Java I started here, there are some nice tutorials that go over all the basics on the bottom of the page.

JavaRanch - Java Hello World, + Tutorials

Instead of giving you code to copy they give you what the output should be and links to the techniques you should use.

Also to make sure you aren't making things to complicated some of them say this should be done in X amount of lines.

Title: Beginning to code with java (No coding experience)

Body:
Possible Duplicate:

  Best Java book you have read so far

I want to learn java but, I have absolutely no coding experience.

what is the best website, book, or anything that is best at teaching java?


答:
I would strongly suggest that you check local community colleges and technical schools for classes.

You are not likely to learn how to program well without some formal education.  Yes, without a formal education you can learn to copy code from examples and modify it, but that's not nearly the same thing.

OwnerDisplayName: Daniel R Hicks


问:
Quit my job (for a new job). Old job wants me to be available for contracting. Steps to take?
The company I am leaving has asked that I make myself available to answer questions and/or debug programs occasionally should the need arise. I'm not opposed to this. After searching google for some kind of standard contract for this sort of thing, I didn't see any.

Is there a standard contract for this sort of thing that you use?

Are there any other steps I should take to ensure this kind of arrangement works smoothly?

答: I would say as time permits make yourself available for outside contracting. That means today they say "We would like X hours from you next week / specific date" and you say "Yes / No / How about N hours?"

ContentLicense: CC BY-SA 2.5


问:
How to tackle a boss who thinks everybody in this world is wrong except him?
I mean seriously, how do you tackle a guy who even changes our variable names (even though they are reasonable) and sends back the code (after review) like 4 times? I know for sure I'm not that bad a developer!

So many times, he enforces his ideals, which are not even best practices in the industry! I point out to him whatever link I can find on the internet trying to prove my point, but in the end he uses his authority to shut us out.

Sick and tired. Frustrated. Do I have any way out other than quitting the job?

答:
Depending on how strict the chain of command is, you might be able to talk to his boss about what is happening if you feel comfortable with that.  Now, if it's the same type of person then you're barking up the wrong tree.

If it's absolutely unbearable and you see no resolution then there's obviously only one possibility...to find employment elsewhere.  There's no need to subject yourself to this type of management if at all possible.

OwnerDisplayName: anon


答:
The IT department actually have a point.

They probably manage thousands of applications on hundreds of systems. The only way they can do this effectively is to have a few selected standard software stacks running on even fewer standard hardware configurations.

If you follow this route you will encounter more and more problems as you get closer to production -- in the worst case scenario you will need to re-factor the whole application to run in a standard production environment days before you go live.

Better to work with the IT group and ask them to configure some standard test environments for you, its what they are paid to do. -- Ironically they will probably set up virtual machine for each environment.

Programers should program, let the IT infrastructure guys provide the infrastructure and the network guys configure the networks -- its how corporations work!

Also if your application is so non standard that IT will not consider building a test environment -- you will have zero chance of getting it in production. Talk to you enterprise architects find out what environments are standard and try to use them. If you really cannot implement your application using the standard software/hardware you need to make a formal request for enterprise architecture to approve your infrastructure as an exceptional case.

Title: Virtualized Development Environments in Enterprise Networks

Body:
We are attempting to implement a development environment using virtualization for a small team of 4 developers within an enterprise organization.  This would allow us to set up separate development, testing, and staging environments - as well as allowing access to new operating systems that are requirements for systems or tools we are evaluating.   We re-purposed an existing workstation-class machine, threw in 24GB RAM and RAID-10, and were doing fine until we attempted to get the machine added to the domain.

Now we are beginning the war that all enterprise developers since the beginning of time have had to fight - the fight for local control of a development and testing environment.  The network and IT admins' have raised concerns ranging from "ESX Server is the enterprise standard" to "servers are not allowed on client VLANs" to "[fill-in-the-blank] is not a skill set currently possessed in the local or enterprise IT organization".

We could justify production-class hardware and formal IT support if we had to, but it would take time and involve a whole lot of headache.  Even then it might take months to formally get IT resources assigned by treating this as a production system - and even if we did, we would likely lose the local control we need.

I imagine that many of you have had similar struggles over developer control of non-production environments - and virtualization in particular - so my questions are as follows:

What strategies and arguments have helped you win over the infrastructure (IT & Network) folks to allow these types of silos to exist within enterprises which have standard network and security policies in place that would generally (and understandably) preclude this type of non-(centrally)-managed infrastructure?

Have you found this to be a matter of technical justification - or more of a political struggle for control and ownership?

If you ended up with a IT-managed development environment, how much of a roadblock has it been for day-to-day development and testing?

Has anyone ended up moving their development environment to a disconnected VLAN or entirely separate network to avoid these network access struggles?

Also, this is not a Hyper-V vs. ESX holy war (we would be fine with either - but Hyper-V was selected since it is "free" with MSDN for these purposes [yes, VMWare has free tools too - but the good management tools generally aren't], and would be easier to manage by the local developers in a "Microsoft Shop") - so arguments for or against either are outside the scope of this question.

This is also less of a virtualization vs. physical hardware - I suppose the same question could be asked without the virtualization component to the equation.

Also assume that the dev team has already made assurances to either manage patch management and antivirus, or integrate with the existing enterprise systems if they will support it.
This scenario, with different questions, is also posted on SF to hopefully elicit the opposing viewpoint.


问:
Need help with directory structure in porting codebase to SVN
Currently we've got a directory structure that looks like this

```
+Inhouse App A
+Inhouse App B
+Core files for inhouse app B
+Inhouse App C
+Something that never came to fruition
+Forgotten Server Project A
+Forgotten Common Files A
+Authentication Server
+Update Server
+Main product Version 5.5
--+[DLL1]
--+[DLL2]
  ...
--+[DLLN-1]
--+[Controls]
-----+[Our Awesome Controls]
-----+[3rd party control 1]
-----+[3rd party control 2]
-----+[3rd party control 3]
--+[DLLN]
--+[Utils]
-----+[Util 1]
-----+[Util 2]
   ...
-----+[Util N-1]
-----+[Util N]
+Main product Version 6.1
+Main product Version 6.2
+Fingerprint SDK

```

Obviously, I am covering up some ugliness of this beauty.  I've got an install of VisualSVN to replace Visual 'shall not be named' and I get to the point where it says, trunk, branch and something else.  and from some other posts here and on SO, I know vaguely what those are for.

My question is what do I do to translate my existing file structure to the source control structure.  We've give up hope of doing any meaningful import.

I've tried just going head first into this already, but I feel I'm missing some key concept.

For instance, should all these things be in the same repo?  If they're not in the same repository, how are they going to find the files shared between the projects?

答:
First of all, the structure of a Subversion repo is just a directory tree. The use of 'trunk', 'branches' and 'tags' directories is just a community convention. As a any convention is better for you to stick to it, but not mandatory. That said, I use to have ONE repository for an application and inside this repo, the classic structure 'trunk', 'branches' and 'tags'. But if the application is big enough or have a bunch of modules you have two alternatives:

A: (For shared versions among modules)

trunk (module-A, module-B, module...)

B: (Versions will go independently for each module)

module-A (trunk, branches, tags); module-B (trunk, branches, tags)

The second alternative could be implemented using a single repository or multiple ones, on the SVN Book (link below) you have a description of each one and their benefits.

If you are not familiar with the usage of directories 'trunk', 'branches' and 'tags', here you have a brief description, but please refer to the SVN Book, and look for "Strategies for Repository Deployment" and "Recommended Repository Layout" sections.

trunk: “main line” of development

branches: divergent copies of development lines

tags: named, stable snapshots of a particular line of development

How do I use them?
 - The first project structure was uploaded to the trunk.
 - Every time a new requirement or project comes we copy the trunk content into a new branch (with a representing name).
 - We work on that branch until completion of UATs (User Acceptance Testing).
 - After that, we reintegrate the branch with the trunk (merge). Note: if more than one branch is going to be released to production you have to do all merges before and ideally test the integration of all changes, using the trunk code.
 - Finally we create a tag, to mark the release of this version to the production environment. Note: all tags are read only, no one on the team can change a tag after its creation. This simple rule ensures that you can go to a known stable version of the code if the some problem occurs.

In summary (and here are your key concepts):

Read the SVN Book.

Understand the basics of subversion

Become familiar with all different projects structres alternatives and choose the one that better fit your needs.

Become familiar with all different branching models, use the matching one depending on the work to do (a bug fix, a request for change, a long project, etc.).

Understand what trunk, branches and tags are for, specially the last one.

Understand what is a working copy, a repository, a revision, the cheap copy concept

Remember not to version your binaries, only your sources. I made this clarification because of your actual layout you have things named "DLLxxx", so I'm assuming they are binaries (.dll files).

After the implementation, if you have troubles getting your partners to work with the tool, here is a possible reason of that behavior: Why developers don’t use a Version Control System (CVS, SVN, Git, Hg, ...)?, please leave your comments or experiences on getting a team on using a versioning tool.


答: There's no intrinsic reason you can't stick with your current directory structure. Dump all of this within trunk/, and you're good to go. You won't necessarily get all of the benefits that might potentially be possible if you had separate branches for v5.5, 6.0 and 6.1, but based on what you're describing, I doubt it is even possible to gain those benefits at this point. Gaining those benefits requires non-trivial workflow changes, and it might be easier to first gain traction with VCS as a general concept that includes tracking, and introduce branches-per-version later on if it makes sense with your workflow.</p>

Title: Need help with directory structure in porting codebase to SVN

Body:
Currently we've got a directory structure that looks like this

```
+Inhouse App A
+Inhouse App B
+Core files for inhouse app B
+Inhouse App C
+Something that never came to fruition
+Forgotten Server Project A
+Forgotten Common Files A
+Authentication Server
+Update Server
+Main product Version 5.5
--+[DLL1]
--+[DLL2]
  ...
--+[DLLN-1]
--+[Controls]
-----+[Our Awesome Controls]
-----+[3rd party control 1]
-----+[3rd party control 2]
-----+[3rd party control 3]
--+[DLLN]
--+[Utils]
-----+[Util 1]
-----+[Util 2]
   ...
-----+[Util N-1]
-----+[Util N]
+Main product Version 6.1
+Main product Version 6.2
+Fingerprint SDK

```

Obviously, I am covering up some ugliness of this beauty.  I've got an install of VisualSVN to replace Visual 'shall not be named' and I get to the point where it says, trunk, branch and something else.  and from some other posts here and on SO, I know vaguely what those are for.

My question is what do I do to translate my existing file structure to the source control structure.  We've give up hope of doing any meaningful import.

I've tried just going head first into this already, but I feel I'm missing some key concept.

For instance, should all these things be in the same repo?  If they're not in the same repository, how are they going to find the files shared between the projects?


问:
Does keeping a journal help in your job?
Years ago, in my first real programming job, my boss encouraged me to keep a journal of my daily activities.  I still do so, although no longer a paper and hand-written one.

Do you keep a journal, if so, what do you write in it, and how does it help you in your job?  Or, does it just take time that is not ever recovered?

答:
I'm biased - I work with lab scientists fairly heavily, so "You don't keep a lab notebook!?" would be met with shock and horror, even though they recognize that most of my work will never go near a lab bench.

But yes, it helps me in my job. While I heavily comment code, there are decisions that are made in the code, and the development of projects, that might take paragraphs of explanation. Or pictures. Or back and forth with myself. A notebook both allows those internal thought processes to be documented in a meaningful place - complete with random side ideas like "Could multiple imputation fix this?" - and allows me to refer back to them to job my memory as to why I chose one concept over another.

It's let me do things like pick up a project and not only know what/why the code is doing (comments), but why those things got coded, while other questions didn't. In my case, it happens to actually be a physical journal.


问:
Best way to delimit variable elements of a path in code documentation?
Often some element of a path is variable, but the path as a whole needs to be documented in some manner for later programmers. Especially when using *nix systems, almost any character is a valid symbol for the path. Given that, I would like to delimit the variable portions of my path to prevent misunderstanding, but in a way that also survives best across different display environments (especially the browser).

Methods I have seen include (example path in users home directory):

/home/<username>/foo - needs special escape for web browser context

/home/your_username/foo - unfortunately the variable element tends to be overlooked

/home/{username}/foo

/home/:username/foo

Which have you seen most often or had the most success with and why? If a double delimiter method (which seems to be the most common/successful), what lead your choice of delimiters?

答: I'd say #1 is the clearest, and whats probably used most often.  The < and > delimit it nicely, and clearly indicate something should be substituted there.</p>


问:
Interviewing someone for general unix skills
How would you test a developer that claims to have *nix shell experience (just to be clear, we don't want to test if someone can develop on *nix, only that they know their way around the command line).

I was thinking about making them solve a problem of getting information out of log files, which would involve some basics like cat, grep, cut, ... combined with piping.

What other basic knowledge would you ask for? Once again, this isn't for interviewing someone who will develop for *nix systems, and also not for *nix system admins, but just for regular developers that sometimes need to do some work on a *nix system.

答:
Out of the top of my head I would probably ask them two things:

When you used the *nix commandline before, did you encounter a case, in which a well thought-out command saved you a lot of time? If so, elaborate.

Please explain the major differences between the *nix commandline and a standard Windows desktop. What are advantages and disadvantages of each?

Clearly, the first will give you an indication of how deep the applicant's knowledge about the commandline goes. If he worked for years on a *nix, he won't just tell you that he was proud to have run a grep. Don't expect them to remember the exact commands of course (there's always manpages for that), but the general idea of what they did.

The second question instead checks if they understand what the commandline is really good at and for what it's not a suitable tool. It's easy to learn to use a hammer, but much harder to switch to another tool in case the hammer is unsuitable. So this question gives you a good indication of the applicant's view outside of the *nix box, plus it is open enough so that he can (and should) score with his knowledge. (Nothing worse than answering something like "uh.. windows has those windows")


答: I'd recommend that they know emacs or vi/m, tar, sed, e/f/grep, the various compilers, some shell scripting. Perhaps run a test where they have to use these tools to grab some code from one file without opening it, insert it into another program; then compile the program which will break on some trivial error. They then need to use a text editor to go in and find the error, get the code working and archive the binary. Then mail it somewhere whilst giving permissions to the recipient to run it.</p>

Title: Interviewing someone for general unix skills

Body:
How would you test a developer that claims to have *nix shell experience (just to be clear, we don't want to test if someone can develop on *nix, only that they know their way around the command line).

I was thinking about making them solve a problem of getting information out of log files, which would involve some basics like cat, grep, cut, ... combined with piping.

What other basic knowledge would you ask for? Once again, this isn't for interviewing someone who will develop for *nix systems, and also not for *nix system admins, but just for regular developers that sometimes need to do some work on a *nix system.


问:
How to cope with the problem of (compiling) a large code base?
Although I can code, I don't yet have any experience with working on large projects. What I did so far was either coding small programs that get compiled in matter of seconds (various c/c++ exercises like algorithms, programming principles, ideas, paradigms, or just trying out api's...) or working on some smaller projects that were made in a scripting language(s) (python, php, js) where no compiling is needed.

The thing is, when coding in a scripting language, whenever I want to try if something works - I just run the script and see what happens. If things don't work, I can simply change the code and try it out again by running the script again and keep on doing that until I get the result that I wanted.. My point is that you don't have to wait for anything to compile and because of that it is quite easy to take a big code base, modify it, add something to it, or simply play with it - you can see the changes instantly.

As an example I will take Wordpress. It is quite easy to try and figure it out how to create a plugin for it. First you start by creating a simple "Hello World" plugin, then you make a simple interface for admin panel to familiarize yourself with API, then you build it up and make something more complex, in the mean time changing how it looks a couple of times.. The idea of having to recompile something as big as WP over and over again, after each minor change to try "if it works" and "how it work/feels" just seems inefficient, slow and wrong.

Now, how could I do that with a project that is written in a compiled language? I would like to contribute to some open-source projects and this question keeps bugging me. The situation probably differs from project to project where some of them that were pre thought wisely will be "modular" in some way while others will just be one big blob that needs to be recompiled again and again.

I would like to know more about how this is done properly. What are some common practices, approaches and project designs (patterns?) to cope with this? How is this "modularity" called in programmers world and what should I google for to learn more about this? Is it often that projects grow out of their first thought proportions which becomes troublesome after a while? Is there any way to avoid long compiling of not-so-well designed projects? A way to somehow modularize them (maybe excluding non-vital parts of program while developing (any other ideas?))?

Thanks.

答:
Partial Rebuild

If the project implements proper compilation dependency DAG then you can get away with only recompiling the object files that your change affects.

Multiple Compilation Process

Also assuming a proper compilation dependency DAG, you can compile using multiple processes.  One job per core/cpu is the norm.

Executable tests

You can create multiple executables for testing that only link particular object files.


答:
You say they are reasonable and he sends back the code. Do you have coding standards? Did you agree to follow them? Are you following them?

The fault may be with you.

Title: How to tackle a boss who thinks everybody in this world is wrong except him?

Body:
I mean seriously, how do you tackle a guy who even changes our variable names (even though they are reasonable) and sends back the code (after review) like 4 times? I know for sure I'm not that bad a developer!

So many times, he enforces his ideals, which are not even best practices in the industry! I point out to him whatever link I can find on the internet trying to prove my point, but in the end he uses his authority to shut us out.

Sick and tired. Frustrated. Do I have any way out other than quitting the job?


答:
Depends of what you want them to do.

For getting information out of log files your suggestion for cat+grep makes perfect sense. I'd add ls, cd and less/more to that.

If you expect them also to do some minor edits (say, in config files), then it would make sense to add testing for vi and/or emacs and for stuff like cp/mv/rm/mkdir.


答:
I don't know about you, but I'd get kind of annoyed if my interviewer asked me and I didn't know how to work on Linux.

You shouldn't really care about what they know right now, but what they can learn if given the chance. Learning *nix tools isn't too hard but it takes a little bit of determination -- you should really test for the ability rather than the knowledge.


答: Pick a good hourly rate, and cash in!  Just be sure your new company is ok with you doing this.  For example, they may not want you doing work for your old company if they are a competitor.

Title: Quit my job (for a new job). Old job wants me to be available for contracting. Steps to take?

Body:
The company I am leaving has asked that I make myself available to answer questions and/or debug programs occasionally should the need arise. I'm not opposed to this. After searching google for some kind of standard contract for this sort of thing, I didn't see any.

Is there a standard contract for this sort of thing that you use?

Are there any other steps I should take to ensure this kind of arrangement works smoothly?


答:
Why do this?

The *nix shells (and other OS shells, fwiw) are very deep and broad working environments. It's possible for somebody to spend years working there and use only a very small % of the shells' capacity.

If you don't expect the person to a) shell program, or b) administer the system from the shell, then why does it matter? Anything that gets done will be at such a basic level that a handy *nix cheat sheet will more than compensate for the "lack of skills".


答:
From my experience with my numerous colleagues since I started to work, nobody wants to fake Unix knowledge: either they "know their way around the command line" or they simply say "no way!".

Just ask if the candidate is willing to work on a Unix workstation and let him tell you how far he can go through bash. He will eventually name some commands; the most obvious ones are cd, cat, more or less, vi or emacs, grep, awk, sed. Listen carefully whether he mentions man.

If it is for developing, he should be familiar with make and Makefiles, and some source control command line interface (svn, git, cleartool, hg, cvs...)


答:
From my personal experience developer working on an *nix system needs to know:

shell variables (how to set/get + knowledge about special ones like
PATH)

shell redirection (capturing output of an program)

pipes (extracting some information from log file is an excelent example)

process control (ps, nice/renice, kill)

file access rights (ls/chmod/chown/chattr)

users (but mostly in context of files/processes, ie: is this process able to access this file? why it can/can't?)

...and as a bonus:

starting/stopping system services

Such a skill set allows to do most developer related tasks with ease.


问:
What should I expect from my first programming job?
I just got hired for my first programming job! I am 25 and have been using Java academically for 6 years.

Now that I have been hired I am nervous that my skills will not be what the employer expects. I am afraid I will be assigned to a project and have to ask lots of questions that my coworkers will feel are amateur.

Is this a rational fear? What were your first programming job experiences? What should I expect? What advice could you give me?

Thanks.

答:
If you ask dumb questions, but only ask once, then your peers won't hate you.
But if you never learn, they will tell your boss to fire you.

Your sich is out of your control.  Either you will be with good people who will want you to succeed, or you will be with evil who will want you to fail.

Try not to be nervous and just do what you can.  And put in lots of extra work learning the language and the company apps.


问:
Should I accept a job if pair programming is required?
I have been offered an interesting job, but there's a big caveat for me: they use pair programming.

I hate the idea of pair programming, and I'm probably not suited for it: I like to do frequent pauses, I hate to see someone programming (I would constantly poke the pair away to code myself), I have to be in full control of the machine I'm working on, I like to work listening music, and basically I don't like to being tied to someone else. I'm not even a social person.

I have however never actually worked with true pair programming (besides few times for a short time to help someone else or to solve a complex task together)... so it is pair programming really that bad? And given my attitude, should I refuse the job or should I leave my current one and give a try?

For people that asked about it: I'm looking for a job where formal design and development are used, as I hate my current job where we are "coding in the wild". The company is very interested in my technical profile so they insisted even when I specified I never worked with pair programming and that I probably wouldn't like it (besides being an unsociable loner programmer, I don't like and believe the very concept of pair programming).

答:
If you already know the technology, you will hate it.
But if you don't know the technology, you will learn it by PP.
If you don't know it and you don't do PP, then you will just sit there and not get anything done.

The worst case possible is if both parties know it and it turns into a race or a pissing contest.


问:
What do you need to succeed with Agile?
Agile adoption can fail in some organizations, I even worked for a company where waterfall was the only (the true) way but only because they tried Agile on a project and failed.

When I asked the people who still remembered that (I was a junior) I was shut down hard, like I was reminding them a bad nightmare that really happened.

I don't know why the project failed. There are resources found on the web why Agile fails is some companies but the reason are mostly economic. So I thought I ask here fore some feedback.

What are the reasons Agile adoption fails in some organizations? Or, another way of putting it.. What do you need to succeed with Agile?

答:
You need management, clients and developers each to understand and support the Agile way of thinking and the Agile methods. In more detail:

Management must be comfortable with hearing the truth, as opposed to what they traditionally expect to hear (i.e. "yes, the project is on track" for 11 months... then suddenly "oops, we need to delay the deadline by a few weeks... erm, months... erm..." in the very end). They must also be comfortable with letting each party do (and take responsibility for) their job. Most prominently, that the developers are to make technical decisions and estimates. So no tight controlling and micro-management.

Clients must understand that Agile requires their deep and continuous involvement in the development process, not just "making the order", then picking up the delivery some months later. They also must be comfortable by the lack of a Big Fixed Requirement Specification and the apparent lack of commitment from the development team to deliver what they were initially requested for.

Developers must be comfortable with taking responsibility, making decisions, communicating openly and working as a team. I.e. no "code ownership", no "lonely cowboys" and no fruitless blaming of others for problems which can be solved by the team itself.

In my experience, it is the first point which most often lies behind failed Agile projects, but the other two can also cause problems.

Update

By "management" I mean not only the direct project manager, but higher levels too. As @Michael very rightly noted, some more or less external parties (e.g. QA or an external task assigner) can also affect the sucess/failure of Agile projects, but I suppose that can only be possible if their respective leader lets them, and/or if responsibilities and lines of command aren't clear within the organization.

Title: What do you need to succeed with Agile?


答:
An agile project will most often fail when a key player refuses to be agile, or (worse) when someone is not honestly interested in the project's success or outright sabotages it. The latter can kill any project (like a number of other things), but agile processes give people more flexibility, and that includes the flexibility to play destructive politics.

Examples:

QA insists that customers cannot see the software unless it has passed a month-long manual test cycle

Management imposes unrealistic deadlines

Customer refuses to prioritize requirements ("they all have the highest priority!")

Someone who's not an immediate stakeholder but has political clout keeps assigning lengthy, unrelated tasks to a key team member, and the project manager can't prevent this.

Title: What do you need to succeed with Agile?

Body:
Agile adoption can fail in some organizations, I even worked for a company where waterfall was the only (the true) way but only because they tried Agile on a project and failed.

When I asked the people who still remembered that (I was a junior) I was shut down hard, like I was reminding them a bad nightmare that really happened.

I don't know why the project failed. There are resources found on the web why Agile fails is some companies but the reason are mostly economic. So I thought I ask here fore some feedback.

What are the reasons Agile adoption fails in some organizations? Or, another way of putting it.. What do you need to succeed with Agile?


问:
Is software development an engineering discipline?
Can software development be considered engineering? If no, what are the things that it lacks in order to be qualified as an engineering discipline? Related to this is this question on Stack Overflow about the difference between a programmer and a software engineer.

There is the Software Engineering Institute at Carnigie Mellon University that prescribes and maintains the CMMI standards. Is this something that will turn development into engineering?

答: No, it's not engineering.  We're not that scientific and we don't have to pass any of those state engineering tests.  In fact, it's illegal to call yourself a software "engineer" in some places due to that lack of testing.</p>

OwnerDisplayName: Vaibhav Garg

OwnerDisplayName: Brian Knoblauch


答:
Is software development engineering? If no, what are the things that it lacks in order to be qualified thus?

Yes, software engineering is an engineering discipline.

Wikipedia defines engineering as "the application of mathematics, as well as scientific, economic, social, and practical knowledge in order to invent, innovate, design, build, maintain, research, and improve structures, machines, tools, systems, components, materials, processes, solutions, and organizations." The result of software engineering is a software system that can improve the lives of people, and it can involve some combination of scientific, mathematical, economic, social, or practical knowledge.

In terms of how it's viewed, academically and professionally, it varies. Software engineering programs can be accredited by ABET as engineering programs. Software engineers can be members of the IEEE. Some companies consider software engineering to be an engineering discipline, while others don't - it's a toss up, really.

The best book on this subject is Steve McConnell's Professional Software Development: Shorter Schedules, Higher Quality Products, More Successful Projects, Enhanced Careers. It looks at software engineering as a profession, evolution from a craft to a profession, the science of software development, the difference between software engineering and software engineering (applying engineering practices to software versus engineers who happen to build software, with a case study that includes my alma mater), certification and licensing, and ethics.

Glenn Vanderburg has a series of talks called "Real Software Engineering" that has has given between 2010 and 2015 at a number of conferences, along with two related talks, "Craft, Engineering, and the Essence of Programming" (given in 2011 as a keynote at RailsConf) and "Craft and Software Engineering" (given in 2011 at QCon London). I think these talks are a pretty comprehensive argument for why software engineering is an engineering discipline.

One argument, which Vanderburg brings up briefly in his talks, is the one made by Jack W. Reeves in 1992 (and revisited again in 2005) on what software design is and how code is the output of software engineering design activities (this is also discussed on the C2 wiki). Once you get away from older schools of thought where specification and modeling is software design and into code being software design, some of the relationships between software engineering and other engineering disciplines become more readily apparent. Some differences and the reasons for those differences become even more apparent after you see that economics of software development are vastly different than many other disciplines - construction is cheap (almost free, in many cases), while design is the expensive portion.

Is that [CMMI] something that will turn development into engineering?

No. CMMI is a process improvement framework that provides guidance to organizations on what kinds of activities are useful when building software. Engineering disciplines typically have an engineering process. Having such a process is important for the successful completion of high quality projects. That said, the CMMI (or any other process framework or methodology) is just a single tool - using it won't make you magically advance from a developer to an engineer. However, not following some kind of process is, in my opinion, a sign of a project that is not an engineering project.

Also, what is your opinion on the software engineering courses/certificates?

It's only as much value as other people put into it. There are useful courses and there are useless courses. There are valuable certificates, and certificates that aren't worth the paper they are printed on. There are a lot of factors, from who is endorsing or accrediting the course or who is issuing the certificate to your current industry of employment to your current job and where you want to go.

Title: Is software development an engineering discipline?

Body:
Can software development be considered engineering? If no, what are the things that it lacks in order to be qualified as an engineering discipline? Related to this is this question on Stack Overflow about the difference between a programmer and a software engineer.

There is the Software Engineering Institute at Carnigie Mellon University that prescribes and maintains the CMMI standards. Is this something that will turn development into engineering?

OwnerDisplayName: Thomas Owens


答:
From Dictionary.com:
en·gi·neer·ing      /ˌɛndʒəˈnɪərɪŋ/

–noun 1. the art or science of making practical application of the knowledge of pure sciences, as physics or chemistry, as in the construction of engines, bridges, buildings, mines, ships, and chemical plants.

I would say that creating software is the practical application of math and computer science, and potentially of any other number of pure sciences depending on the application.

[EDIT] FWIW, I don't call myself a software engineer, but a software developer so I don't have a personal stake in this.

OwnerDisplayName: tvanfosson


答:
Yes, one should be able to apply standards and principles to arrive at a decent product.  What makes it difficult is the mindset of the client (it's just code - it shouldn't cost that much to change),  the extreme difficulty in codifying what the product should do into machine code (spoken/written language to code) and quantifying "quality".  Your definition of quality isn't mine.

It's also repeatability.  Take a set of requirements and give it to two teams.  When you can get the same thing out (without the teams talking to one another) you're pretty close to engineering.

Other areas of engineering also have penalties and a rigid review and sign off. Accountability.

OwnerDisplayName: jim


答:
By far I've seen (and used) /home/<username>/foo the most. Don't worry about special escapes for such comments because all of your code is going to need to have those characters escaped when displayed in a browser (you may very well have statements like echo "
"; in your code.

If escaping isn't possible for some reason, you can surround the term with spaces or underscores to prevent HTML parsing:

/home/<_username_>/foo

One added benefit of underscores is that some markups (like Markdown) will automatically make them italicized:

/home/<username>/foo

making them understandable in a text editor and nicely formatted in a webpage.

Title: Best way to delimit variable elements of a path in code documentation?

Body:
Often some element of a path is variable, but the path as a whole needs to be documented in some manner for later programmers. Especially when using *nix systems, almost any character is a valid symbol for the path. Given that, I would like to delimit the variable portions of my path to prevent misunderstanding, but in a way that also survives best across different display environments (especially the browser).

Methods I have seen include (example path in users home directory):

/home/<username>/foo - needs special escape for web browser context

/home/your_username/foo - unfortunately the variable element tends to be overlooked

/home/{username}/foo

/home/:username/foo

Which have you seen most often or had the most success with and why? If a double delimiter method (which seems to be the most common/successful), what lead your choice of delimiters?

Body:
By far I've seen (and used) /home/<username>/foo the most. Don't worry about special escapes for such comments because all of your code is going to need to have those characters escaped when displayed in a browser (you may very well have statements like echo "<table>"; in your code.

If escaping isn't possible for some reason, you can surround the term with spaces or underscores to prevent HTML parsing:

/home/<_username_>/foo

One added benefit of underscores is that some markups (like Markdown) will automatically make them italicized:

/home/<username>/foo

making them understandable in a text editor and nicely formatted in a webpage.


答:
IMHO the term 'software engineering' was coined to try to better describe the range of things a developer does, rather than just being a 'programmer' (which has overtones of some mechanistic process with little thought or creativity).

Personally I prefer the emerging analogy of a developer as a 'craftsman', championed by the pragmatic programmers, among others.

Historically, people have tried to analogise software creation with manufacturing. I think  Jack Reeves made a pretty good argument to discredit this idea in his article What Is Software Design.

OwnerDisplayName: johnstok


答:
In my view a Software Engineer and Software Developer are two different things.

I see a software engineer as one who does planning, such as what life cycle will the development take, doing requirements/specifications, etc... Basically, a software engineer deals with lots of documentation. This can be accomplished by a software developer and/or project manager.

A software developer would be more closely related to a programmer but with more skills in other areas like database management, etc..

One interesting thing to bring up is Architecture. Someone who is also involved in figuring out what hardware/software will be needed for the life cycle of the project.

OwnerDisplayName: avgbody


答:
I would argue that there is indeed such a thing as software engineering.

Engineering involves the systematic application of scientific knowledge to the solution of problems. The complexity of problems that are tackled today are not that different from those tackled by an electric engineer in creating a circuit or a chemical engineer in devising a manufacturing process or a mechanical engineer in the creation of a device.

The fact that there is also a hands-on approach of applying existing plans (development in this case) is simply similar to the fact that in other fields somebody else executes those plans (e.g., the construction worker).

It is true that most developers also carry software engineering tasks, and that our education is often not in programming but rather in software engineering. So we get our hands dirty whereas a civil engineer would not.

However, the ability to apply a programming language and program does not turn one into an engineer: I have met my share of developers who lack a true understanding of the complexities and issues outside their current piece of code.

As for your question regarding CMU: Application of a standard or practice (e.g., CMMI) does not automatically turn a person's work into engineering. However, the fact that there are organiztions which carry out scientific research to provide new practices is again a sign that there is such a thing as engineering.

OwnerDisplayName: Uri


答:
I'm going to go with "No" here. My brother is a mechanical engineer, and he describes engineering as "The Art of Being Cheap":

"Engineers are more concerned with getting things done as fast as possible, at the lowest cost possible, with the fewest materials possible."

In reaction, I've come to describe software development (not software engineering - they really are fundamentally two distinct fields) as "The Art of Being Efficient":

"Developers are more concerned with getting things done as fast as possible, at the lowest cost possible, with the least amount of repetition possible."

The difference is in the last part of those sentences.

OwnerDisplayName: Lieutenant Frost


答:
Is software development engineering?

No. Being an engineer means your project follows a cause-and-effect timeline - you follow the building codes, therefore your building doesn't fall down (or at least you can't be blamed if it does). Writing software, you can follow all the guidelines going (and there's so many different ones to choose from!) and it still might hang/crash/give wrong answers (unless you're involved in the remarkably small field of writing provable programs in side-effectless functional languages).

OwnerDisplayName: David Hicks


答:
I see an engineer (mechanical, structural, software) as someone who designs the product beforhand based on the understood needs and an understanding of what and how to apply the materials to accomodate that need.

For example, you may often see a structural engineer looking up different strengths of steel and applying rules of physics to calculate materials required and how they should be implemented.  Structural engineering is a prime example because you always end up with a blueprint (specification) of what you're going to build before you build.  That doesn't always happen with software.

To me the difference of a software engineer and a programmer is that the engineer is capable of building the specification for what will be produced before writing any code, where a programmer either just writes the code based off someone elses specifications, or is one of those wild west programmers who writes code without specifications.  As well, the engineer has his degree.

I liken the difference between a construction worker and a structural engineer to the difference between a programmer and a software engineer.

To clarify, I only have a college diploma, so can't call myself an engineer.

OwnerDisplayName: Jeremy


答:
No. Software Engineering is not engineering. In my opinion, the difference is in the amount of creativity involved. In Civil Engineering, for instance, there can be very little or no creativity. This is a good thing.

To construct a bridge, you have a set of specifications (I need to get this number of cars from this side of the river to the other side).

From this, I can deduce:

the number of lanes of road I need (using a standard calculation defined by the government);

the loads I will need to support (using calculations defined by the government)

the materials I need to use to support those loads (using either standard materials, which I can get from a number of different suppliers, or non-standard materials, which I then have to prove will have the correct properties).

Then, I must get the design approved and checked by a third party (another company) to ensure that I've done my calculations correctly.

Then, when the bridge is actually constructed, the work will be done by qualified people in a standard way. They will be doing work that they have done hundreds, maybe thousands of times before.

Don't get me wrong, every civil engineering project is different, but it seems every time I develop a new application/website, things get done differently.

OwnerDisplayName: Matthew Farwell


答:
Coming from a typical engineering background, but making a career in software development, I see large similarities between both worlds. Apart maybe from the exact definition of engineering, I see in practice that developing software is not that different from developing a physical product. At least I think it should not be very different.

Whether you design an aircraft or a software application, for both you need to:

make designs

define subsystems and components

make prototypes

specify and execute tests

etc.

I read somewhere in an other answer that designing software is different because you do not design everything before you start programming. Well actually to a lesser extent that is also the case when you design a physical product. Designing and prototyping and testing is an iterative process.

Also when software projects grow in size it gets more important to define clear subsystems, components and interfaces which is also similar to designing complex products such as an aircraft.

That is why I consider developing software to be engineering.

OwnerDisplayName: Roy


答:
Software development is engineering.

A few arguments made by others for why software engineering does not meet the standard of engineer:

Some say engineers are in the business of designing "things" for the public good - are ICBMs, Tanks, etc in the public good?  Some would say yes (a good offence is a good defense) others would say no.  However, I don't think anyone would disagree that the guy who designs the next generation tank targeting system is an engineer.  Public good can be subjective. At any rate plenty of software is in the public good so the point is moot either way.

Others say engineers design they don't build.  I have seen several "mechanical engineers don't weld" type comments.  I would argue that mechanical engineers produce blueprints - detailed designs that something else implements.  If a mechanical engineer produces a blueprint and feeds that to a CNC machine does that make them no longer a mechanical engineer - because a machine did the implementation instead of a person?  I would argue that source code is a detailed blueprint that is fed to a machine that does the implementation and I fail to see how that is any different than a MechE feeding code to a CNC machine.  And we now have 3d printers, does that signify the end of mechanical engineers?  Are they now mechanical developers?

Licensure is the other topic that I see come up.  Currently only a few jurisdictions license software engineers.  There is (so far) no US wide licensing of software engineers (I think only Texas does so).  Some have used this as a reason to state that software engineering should not be called engineering.  The PE for software engineers is coming.  But on a more philosophical level just because some state legislators choose (or not) to call software development engineering has no effect on reality.

OwnerDisplayName: erick


答:
You need:

People who are willing to be very open and honest. Visibility is everything because you need trust across all sorts of layer-boundaries.

Customers and managers who really want to hear the truth.

People who are willing and able to redefine their roles to suit what's needed right now.

Freedom to change processes that aren't working right now.

People who are willing to admit mistakes and reverse them.

The ability to throw together build and test environments at will. (This is more important and more expensive than people give it credit.)

As many whiteboards as you can fill your walls with.

Seems so simple, but a lot of these are big asks in this industry.

Title: What do you need to succeed with Agile?


答:
When you do ask a question, make sure you:

Prepare before asking

Give the person you're asking time to come out of the zone

Try to make the other person feel clever

http://www.artificialworlds.net/blog/2011/02/12/how-to-ask-technical-questions-in-person/

Title: What should I expect from my first programming job?

Body:
I just got hired for my first programming job! I am 25 and have been using Java academically for 6 years.

Now that I have been hired I am nervous that my skills will not be what the employer expects. I am afraid I will be assigned to a project and have to ask lots of questions that my coworkers will feel are amateur.

Is this a rational fear? What were your first programming job experiences? What should I expect? What advice could you give me?

Thanks.


答:
It depends on what level of experience you want them to have. IF this isn't for someone who will develop for *nix systems, and also not for *nix system admins, but just for regular developers that sometimes need to do some work on a *nix system, how much experience do they actually need?

Anything such a developer might need in *nix shells (ls, chmod, cat etc.) could probably be written on a single page cheat sheet. If so, requiring *nix shell knowledge where it is not required might eliminate some good candidates.


答:
Unix gurus have core commandline commands such as sed, grep etc. in one finger and can easily use them to achieve what they want, using all kinds of quotes, advanced regular expressions etc., so sometimes you see the script and think it would be easier to understand beeing written in Chinese ;)

You can expect that, independently from shell programming, they will know at least one additional scripting language, such as Perl.

They would know configuration internals of Unix system, so if you ask them to change keyboard layout (f.g. add some binding to right alt + ) they wouldn't be confused.

Managing installed packages also would be no problem. Installing Oracle, running 4 application servers, each with other JVM - also no problem. Virtual network configuration, advanced routing and port filtering, virtual machines etc., managing security - also goes there.


答:
You are in a good position here as your old company has asked you for help.

Take the following steps;

Get the agreement of your new employer

Decide on how much time you are prepared to spend on this and when you want to spend that time.

Pick a sensible hourly rate - ask a recruitment agency in your area what the average is and charge that.

Agree on how much notice your old employer must give you for a request for work.

Agree when and how your old employer can contact you. You don't want them ringing you at your new employer so e-mail conversations is probably best.

Be prepared to negotiate - while you are in a good position if you ask for too high a rate (for example) they might suddenly find that they have the skills in-house after all.


问:
How do I convince my boss to use REST over SOAP?
We need to create an API to our system. How do I convince my boss that REST is a better option than SOAP (or XML-RPC)?

I say REST is...

easier to implement and maintain

not much new to learn -- plain old HTTP

lot of people have chosen it Yahoo ~ Facebook ~ Twitter

will be lot quicker to code

My boss says SOAP is...

richer and more expressive

it's all standard XML (SOAP, WSDL, UDDI) -- and so will be easier to consume

well standardized than REST

Google uses a lot of SOAP

it is important to adhere to SOAP standards than to create a custom XML schema in REST

答:
SOAP or REST? Other answers do a good job of helping you argue the point from a technical perspective. However I predict a KO is unlikely simply because technically you could do most things with either approach. There are a the few exceptions that may lead to a technical knockout e.g.:

if API requests should be routable through external messaging middleware while still allowing the recipient to authenticate and verify the original sender, then SOAP wins

if you want to use your existing application's authentication and access control logic, then REST can be virtually a NOP, while for SOAP that can be a mini-project in it's own right.

If you don't have one of these exceptional requirements as a must-have, and since you are not the boss(!), I think the best you can hope for is a draw because although the decision appears "technical" it will remain subjective.

But .. if you want to make the best decision (and not just win an argument), maybe you can push to look at this, with your boss, in a different way:

Since you "need to create an API to our system", I'm inferring this is not just an internal technical detail of you system and "Technical arguments are for technical people -- aka, people who will be doing the work" doesn't apply. There's a group of people out there somewhere that will have to deal with whatever you deliver, and I think you would probably like them to use it and love it? If so:

What they need for the API probably trumps any arguments you or your boss can come up with (at least that's what they would think)

e.g. if they will want to integrate with your API via BizTalk or somesuch, then maybe SOAP it is (document literal and all). But if they are coders that will be writing to your API, SOAP may be the death knell for adoption, while REST will make you heroes.

If you already know who these people are, I reckon you should ask them what they need from an API. If it's a "new market", then maybe try to rope in the best representatives you can find, or at least try to describe and understand what the "representative customer environment" is going to be to help inform the decision.

In other words, I'd recommend you see if you can find the customer voice either from real external customers, or others in the organisation or partners who can do a good interim job pre-launch.

(then when they tell you "REST! Don't you dare give us some Rube Goldberg SOAP monstrosity", you can smile knowingly at your boss)


问:
Checking members and instantiating in properties
Consider this:

```<code>public MyClass
{
    private Resource _myResource;

    public Resource MyResource
    {
        get
        {
            if(_myResource == null)
            {
                _myResource = new Resource();
            }

            return _myResource;
        }
    }

    public void UseResource()
    {
        MyResource.DoSomething();
    }
}
</code>```

Is this a recognised pattern, or possibly an anti-pattern? I've never seen it suggested in any books, but it does come up time and time again in code I see. I think the logic of this is that _myResource is instantiated 'just in time'. To me, it seems a bit smelly. UserResource() is accessing a public property from within the class, and the resource can never really be accessed through the private member - if someone did, _myResource could be null.

Maybe performance reasons may sometimes necessitate, but I would generally favour instantiating in the constructor, or just having an instance of Resource local to the method.

So is this an accepted pattern, or should it be avoided?

答:
This is an accepted pattern. It's called lazy initialization, a creational pattern. You usually use this for performance reasons, often combined with other patterns, for example the Proxy Pattern. When resources are heavy and you don't need them right away, then this is a good and clean approach to make sure they're only initialized the first time you need them.

Wikipedia calls it a "tactic of delaying the creation of an object, the calculation of a value, or some other expensive process until the first time it is needed".

ORMs for example use this pattern to perform lazy initializations of related entities, so you needn't fetch a whole aggregate object-graph eagerly, but only when you really need to operate on the related entities.

Maybe performance reasons may sometimes necessitate, but I would
  generally favour instantiating in the constructor, or just having an
  instance of Resource local to the method.

Sure, this might be a cleaner approach. But if the resources are really costly to instantiate, then lazy initialization is a good way to deal with them. Do you really want to wait a long time for instantiating an object that by itself is lightweight, but occasionally needs a heavy resource?

To me, it seems a bit smelly. UserResource() is accessing a public
  property from within the class, and the resource can never really be
  accessed through the private member - if someone did, _myResource
  could be null.

It looks indeed a bit smelly and if it is used everywhere and not by its purpose then it really stinks. As with all optimizations: Don't optmize if you don't need an optimization. But lazy initialization can be a great benefit to your application when used right. And then its inconspicuous smell is a small price to pay for its worth.


问:
Understanding how audio/video chat works in the iPhone SDK
I am really looking forward on creating a chat application which features basic implementation of text chatting, as well as advanced features of audio/video chatting. I have clearly understood how to implement text chatting feature using push notification.

Now I am heading towards implementation of audio/video chatting in my application. I Googled around to see some samples for the same. I found Voice chatting, idoubs and a couple of more sources, but ended on a negative note. What I realized is I am not sure of what actually happens during a audio/video chat. What are the background activities which take part when user is chatting.

I believe, if I understand the process behind the audio/video chat, I may implement it in a way I too understand.

So, if anyone among you has a brief/detail knowledge regarding audio/video chat, kindly share it with me.

答:
A really brief audio/video starter would be the camera basically takes a series of images incredibly quickly and stores them to a buffer, these are then encoded into a specific format to be sent to a receiving device, which gets the video, stores it into a buffer and runs it through a decoder so it understands what the video it's received is. The decoder then passes the unencoded video frames to a specific view which constantly reloads the image which creates your video.

There's a bit more to it than that, but that's as basic as video comes. Audio works the same way pretty much, encoders and decoders do the grunt work of getting the sent content into an understandable output.


问:
When can you call yourself good at language X?
This goes back to a conversation I've had with my girlfriend. I tried to tell her that I simply don't feel adequate enough in my programming language (C++) to call myself good. She then asked me, "Well, when do you consider yourself good enough?"

That's an interesting question. I didn't know what to tell her. So I'm asking you.

For any programming language, framework or the like, when do you reach a point were you sit back, look at what you've done and say, "Hey, I'm actually pretty good at this."? How do you define "good" so that you can tell others, honestly, "Yeah, I'm good at X".

Additionally, do you reach these conclusions by comparing what others can do?

Additional Info

I have read the canonical paper on how it takes ten-thousand hours before you are an expert on the field. (Props to anybody that knows what this paper is called again)

I have also read various articles from Coding Horror about interviewing people. Some people, it was said, "Cannot function outside of a framework." So they may be "good" for that framework, but not otherwise in the language. Is this true?

答: I know this is a pretty hard question. I did two subjects with where I mainly programmed in C++ and got high distinctions in both. I wouldn't consider myself good at C++. In fact, if I was applying for a job, I would leave it off my resume and just write C instead. The whole language just isn't my thing.</p>


问:
Project (that contains reverse engineering) hosting + license
I made multiple tools for extracting file formats that are found in (commercial) games. Where should I host the code? (e.g. Google Code, Sourceforge,....)

Normally it would be considered 'illegal' everywhere, but most of the time they are ignored. Where should I host it and what license should I choose for the project to be 'on the safe side'.

[I asked this question on SO and it got closed, meta suggested that it would fit here a bit more, if it doesn't even fit here please help me at least rephrase it]

Edit: An example: A game has glued together GZip compressed files with binary metadata slaped on them. (let's call them .archive files)

I KNOW that I'm not allowed to use that data for anything else then playing the game, but I'm interested in modding said files so I wrote a packer/unpacker for that .archive .
Now I want to make it public on a project page, which one should I choose?

All the modding tools I saw till now have that 'ONLY FOR NON-PROFIT EDUCATIONAL USE'
and they normally don't get taken down. But I want to be sure to choose an actual license for the sourcecode.

答:
Normally it would be considered 'illegal' everywhere, but most of the
  time they are ignored. Where should I host it and what license should
  I choose for the project to be 'on the safe side'.

Your question is moot. If your software is illegal then you cant licence it legaly and no hosting provider will host it. If it is legal then you can use any of the providers/licences you want. I suggest you consult a lawer if your not sure if its legal or not.

I suspect that other modding tools are allowed by the game manufacturer so long as the mods are not for proffit. That would vary case by case though and you would need to talk to the manufacturers and/or a lawer.


答:
I usually pick a simple task and ask the person to write a shell script on a whiteboard. </p>

<p>"You have a directory "foo" and a backup directory "foo_backup".  Write a shell script to see what has changed in "foo" since "foo_backup" has changed.  </p>

Body:
I usually pick a simple task and ask the person to write a shell script on a whiteboard.

"You have a directory "foo" and a backup directory "foo_backup".  Write a shell script to see what has changed in "foo" since "foo_backup" has changed.


问:
What technology is used to build "Visual Studio 11"?
A preview of the new "Visual Studio 11" was recently shown at Microsoft's BUILD conference.

Out of interest, what technology is being used to create it?

I assume it's not WinRT (which I've been led to believe is only for Metro style apps in the new Windows 8 touch-first environment)

Is it still using WPF (like 2010)?

Is it built on .NET 4.5?

Are there any new technologies going into it?

Do we know?

答:
My best guess is it is still written using the same technology as Visual Studio 2010.

Visual Studio 2010 was written in C#/WPF but most likely some C++ as well.

The demonstrations showed it didn't run in Metro Style (luckily), but it switched to the ordinary desktop environment which doesn't run on WinRT. Do note that .NET 4.5 can/and should do WinRT calls. I recall (can't verify this atm) that some parts of .NET 4.0 were dropped as they are now encompassed within WinRT.

Whether you need the .NET 4.5 runtime in order to run Visual Studio 2011 I don't know, but you could perhaps find out by installing the developer preview.

ContentLicense: CC BY-SA 4.0


答:
I think what all of the answers so far have been alluding too, is that large software projects are almost always broken down into much smaller pieces.  Each piece is normally stored in it's own file.

These pieces are individually compiled to create objects.  The objects are then linked together to form the final product.  [In a way, it is sort of like building stuff out of Legos.  You don't try to mold the final thing out of one big piece of plastic, instead you combine a bunch of smaller pieces to make it.]

Breaking the project into pieces that are individually compiled allows some neat things to happen.

Incremental Building

First off, when you change one piece, you usually don't have to recompile all of the pieces.  Generally speaking, as long as you don't change how other pieces interact with your piece, the others do not need to be recompiled.

This gives rise to the idea of incremental building.  When doing an incremental build, only the pieces of that were affected by the change are recompiled.  This greatly speeds up development time.  True, you may still have to wait for everything to be relinked, but that it still a savings over having to both recompile and relink everything.  (BTW: Some systems/languages do support incremental linking so that only the things that changed have to be relinked.   The cost for this usually is in poor code performance and size.)

Unit Testing

The second thing that having small pieces allows you to do is look at individually testing the pieces before they are combined.  This is known as Unit Testing.  In Unit Testing, each unit is individually tested before it is integrated (combined) with the rest of the system.  Unit tests are normally written so that they can be quickly run without involving the rest of the system.

The limiting case of applying testing is seen in Test Driven Development (TDD).  In this development model, no code is written/modified unless it is to fix a failed test.

Making it Easier

So breaking down things seems good, but it also seems like a lot of work is needed to build the project: you need to figure our what pieces changed and what depends on those pieces, compile each piece, and then link everything together.

Luckily, programmers are lazy*, so they invent a lot of tools to make their jobs easier.  To that end, many tools have been written to automate the task above.  The most famous of these have already been mentioned (make, ant, maven).  These tools allow you to define what pieces need to be put together to make your final project and how the pieces depend on each other (i.e. if you change this, this needs to be recompiled).  The result is that issuing just one command does figures out what needs to be recompiled, compiles it, and relinks everything.

But that still leaves figuring out how things relate to each other.  That's a lot of work and as I said before, programmers are lazy.  So they have come up with another class of tools.  These tools have been written to determine the dependencies for you!  Often the tools are part of Integrated Development Environments (IDEs) like Eclipse and Visual Studio, but there are also some standalone ones used for both generic and specific applications (makedep, QMake for Qt programs).

*Actually, programmers aren't really lazy, they just like to spend their time working on problems, not doing repetitive tasks that can be automated by a program.

Title: How to cope with the problem of (compiling) a large code base?

Body:
Although I can code, I don't yet have any experience with working on large projects. What I did so far was either coding small programs that get compiled in matter of seconds (various c/c++ exercises like algorithms, programming principles, ideas, paradigms, or just trying out api's...) or working on some smaller projects that were made in a scripting language(s) (python, php, js) where no compiling is needed.

The thing is, when coding in a scripting language, whenever I want to try if something works - I just run the script and see what happens. If things don't work, I can simply change the code and try it out again by running the script again and keep on doing that until I get the result that I wanted.. My point is that you don't have to wait for anything to compile and because of that it is quite easy to take a big code base, modify it, add something to it, or simply play with it - you can see the changes instantly.

As an example I will take Wordpress. It is quite easy to try and figure it out how to create a plugin for it. First you start by creating a simple "Hello World" plugin, then you make a simple interface for admin panel to familiarize yourself with API, then you build it up and make something more complex, in the mean time changing how it looks a couple of times.. The idea of having to recompile something as big as WP over and over again, after each minor change to try "if it works" and "how it work/feels" just seems inefficient, slow and wrong.

Now, how could I do that with a project that is written in a compiled language? I would like to contribute to some open-source projects and this question keeps bugging me. The situation probably differs from project to project where some of them that were pre thought wisely will be "modular" in some way while others will just be one big blob that needs to be recompiled again and again.

I would like to know more about how this is done properly. What are some common practices, approaches and project designs (patterns?) to cope with this? How is this "modularity" called in programmers world and what should I google for to learn more about this? Is it often that projects grow out of their first thought proportions which becomes troublesome after a while? Is there any way to avoid long compiling of not-so-well designed projects? A way to somehow modularize them (maybe excluding non-vital parts of program while developing (any other ideas?))?

Thanks.


问:
Challenges to the Agile approach on government projects
A previous Agile discussion here had good answers specifying what is critical to the success of implementing Agile methodology in software development.  Most of the points were the typical organizational and management challenges, but one point worries me and it is that the client must be involved throughout the process.

The client is the one thing that you cannot control realistically, perhaps your business model gears you to government contracted work for instance where an intensely strict contract obligates the company to:

Provide X features exactly as requested

Feature requests will be thrown over a wall, don't bother us we don't want to hear it.

There is no concept of feature priority in the customer's mind, they are all important or we wouldn't have asked for them.

The project will cost no more and no less than Y regardless of overruns or deadlines.

Absolute, strict, final and non-negotiable deadline for complete delivery of all work.

We have never worked with such a client before but the money on the project is just too good to pass up.  We need this work.

I came here and worked HARD to change processes within to move towards Agile development and here I don't know how to reconcile where this project fits into our new process.   I have never before had the luxury of open-minded hands-off management that trusted me to lead the development team and processes down this path and now that we are here I can't honestly tell myself that this project will truly be done in an Agile way.  I feel like management trusted me to lead this path and that I let them down because this situation we are in now so clearly calls for Waterfall.  I am afraid that I might lose their trust if I backtrack now.

Other answers like the one here say Agile is impossible with this kind of client, do you agree?  Have any of you been in a similar situation and made it work?  What strategies did you implement to make Agile happen successfully?

答:
Yes, agile isn't appropriate for such a project, because it sounds like the requirements are already done and fixed in stone, probably the result of years of analysis by expensive consultants, committee meetings and political compromise.  Waterfall works fine if the customer's so disciplined that they can tell you in writing exactly what they want.  They might be wrong, but at least you have it in writing, and you'll get paid if you deliver that.  (This says nothing of customer satisfaction, of course.  Chances are you'll deliver something that they don't actually need.)

Agile was created to solve a problem that you don't have: risk due to uncertainty in the requirements.

It's true that the customer might ask for change requests, but you either follow one of two paths:

The money was so good that you know you can absorb X amount of new features at various stages of the project and still come out without losing your shirt, or

You make it clear to the customer at the outset that due to them negotiating a tight price, that each new feature request will generate a change order with a price that will have to be approved by them, with an accompanying purchase order (or amendment to the original purchase order) in order for you to implement that.  The change order will spell out any impacts to the functionality or schedule.  If they say the deadline can't be moved, then change orders just become exponentially more expensive as the project progresses because it's more expensive to change stuff later on.

The relationship feels a lot friendlier under situation #1, but the fact is it's pretty rare to find purchasing departments that won't squeeze you on the price, so most of the time you're in situation #2.  That means the relationship is confrontational, but if you want to survive in business, you have to get good at managing the relationship while holding your ground.  This is a large part of the project manager's job.

It sounds like you might be in situation #1, which is good.  I imagine that government contracts are the only place where they don't care about money, because, after all, they're not spending their money, they're spending your money.


问:
Obtaining the best of both worlds: MVC and WebForms
Rather than asking a general question about WebForms vs MVC (such as in ASP.NET v/s ASP.NET MVC), I have a specific quesiton.

It appears the main differences between the two approaches are

WebForms is Event Driven and uses pre built components

MVC has a built in layer that WebForms does not: the Model

MVC has the Controllers in a separate folder than the Views while the WebForms Controller is the CodeBehind

One could easily add a folder to a WebForm project called "Model" that stores all the business logic which used in the Code Behind (decoupling the two).  The main argument against WebForms is that it's "easy" to write business logic in the CodeBehind.  But you could easily add business logic in your MVC controller completely violating the separation of concerns.

Now for the question:  Isn't it the case that you could write a WebForms project in such a way that the business logic is separate from the Controller/Code Behind which would have all the benefits of MVC (separation of concerns) while keeping the benefits of WebForms: rich controls, Event driven (if you like events)?

答:
What you're describing is the MVP pattern. There is a framework called WebFormsMVP specifically designed to facilitate this.

I'm not sure many will agree that it's the best of both worlds, but it is a considerably more testable way to use WebForms than putting all your code in the codebehind class.

However, putting a service layer in between your forms and your data model also achieves this, much more simply.


答:
I think this type of client is not the norm. You're dealing with a group that has requested similar projects before, so they do know exactly what they want. You never mention that their specifications will change.

Provide X features exactly as requested

I'm lucky if I provide X feature vaguely as suggested and be ready to change it at a moments notice.

Feature requests will be thrown over a wall, don't bother us we don't
  want to hear it.

If you know what they want, go and build it.

There is no concept of feature priority in the customer's mind, they
  are all important or we wouldn't have asked for them.

You can't lose on this one. Build them as you see fit.

The project will cost no more and no less than Y regardless of
  overruns or deadlines. Absolute, strict, final and non-negotiable deadline for complete delivery of all work.

That's a tough one if you've never built a project for the gov. If you have some history, you may be able to determine if you can deliver. This doesn't mean they don't pay well (they're notorious for paying $50 for a $10 hammer.) or have unreasonable expectations. With these specs, someone on your team should act as the customer and approve the work compared to the specs. Even if you found a flaw and begged them to change the requirements, they probably wouldn't.

Title: Challenges to the Agile approach on government projects

Body:
A previous Agile discussion here had good answers specifying what is critical to the success of implementing Agile methodology in software development.  Most of the points were the typical organizational and management challenges, but one point worries me and it is that the client must be involved throughout the process.

The client is the one thing that you cannot control realistically, perhaps your business model gears you to government contracted work for instance where an intensely strict contract obligates the company to:

Provide X features exactly as requested

Feature requests will be thrown over a wall, don't bother us we don't want to hear it.

There is no concept of feature priority in the customer's mind, they are all important or we wouldn't have asked for them.

The project will cost no more and no less than Y regardless of overruns or deadlines.

Absolute, strict, final and non-negotiable deadline for complete delivery of all work.

We have never worked with such a client before but the money on the project is just too good to pass up.  We need this work.

I came here and worked HARD to change processes within to move towards Agile development and here I don't know how to reconcile where this project fits into our new process.   I have never before had the luxury of open-minded hands-off management that trusted me to lead the development team and processes down this path and now that we are here I can't honestly tell myself that this project will truly be done in an Agile way.  I feel like management trusted me to lead this path and that I let them down because this situation we are in now so clearly calls for Waterfall.  I am afraid that I might lose their trust if I backtrack now.

Other answers like the one here say Agile is impossible with this kind of client, do you agree?  Have any of you been in a similar situation and made it work?  What strategies did you implement to make Agile happen successfully?


答:
Mandatory Disclaimer: I am not a lawyer so please take this advice with a grain of salt. If in doubt, contact a lawyer that works in your jurisdiction

Depending on the game, I think you are confusing "illegal" with "against the Terms of Service". There is a big difference in one will get you huge fines (if it is civil) or jail time (if they are able to charge you with criminal acts) while the other will get you banned from the game (losing your $40 or so).

Games like Diablo 2, there is no law against opening the character files and editing it because you bought the game and you own that copy of the game and all associated files. However, on closed battle.net they don't like cheaters so if you are caught doing that, you'll be kicked off. You can still play with hacked/modded files on your own though.

Now, a game like World Of Warcraft has a EULA stating that you don't own the game or the files and that you are just licensing them from Blizzard. In that case, you would be breaking the EULA and they could suspend your account and possibly bring civil charges against you if they feel like you caused them financial hardships.

Bottom line is that it is dependent on the game and the terms that you agree to when you play. If you have doubts to the "legality" you could always ask the publisher of the game if it is ok that you create your mods or whatever you plan to do.

As for hosting the code, you could host it where ever you would normally host code: github, bitbucket, google code, sourceforge, etc. Just be aware that they will act in their best interest and if they get contacted by the game publisher they will most likely take down your code with no questions asked.

Title: Project (that contains reverse engineering) hosting + license

Body:
I made multiple tools for extracting file formats that are found in (commercial) games. Where should I host the code? (e.g. Google Code, Sourceforge,....)

Normally it would be considered 'illegal' everywhere, but most of the time they are ignored. Where should I host it and what license should I choose for the project to be 'on the safe side'.

[I asked this question on SO and it got closed, meta suggested that it would fit here a bit more, if it doesn't even fit here please help me at least rephrase it]

Edit: An example: A game has glued together GZip compressed files with binary metadata slaped on them. (let's call them .archive files)

I KNOW that I'm not allowed to use that data for anything else then playing the game, but I'm interested in modding said files so I wrote a packer/unpacker for that .archive .
Now I want to make it public on a project page, which one should I choose?

All the modding tools I saw till now have that 'ONLY FOR NON-PROFIT EDUCATIONAL USE'
and they normally don't get taken down. But I want to be sure to choose an actual license for the sourcecode.


答:
...government contracted work for instance where an intensely strict contract obligates the company to:

First.  It's strict.  But it's not inflexible.  It simply requires attention to detail and a long, long string of change orders.

Government agencies actually are agile in a slow, inefficient way.  You have to write (and negotiate) formal, detailed change orders all the time.

Provide X features exactly as requested

Until modified by a change order.

Feature requests will be thrown over a wall, don't bother us we don't want to hear it.

The channel of communication is the change order.  Budget and Schedule Impact.

There is no concept of feature priority in the customer's mind, they are all important or we wouldn't have asked for them.

This is hard to work around.  Even non-government businesses that spend a lot of money for "requirements analysis" don't want to be told that a big, flat, steaming pile of requirements unencumbered by priority and tradeoff information is incomplete.  They paid good money to get all the requirements.  How can you want more information?

This is a difficult problem.

The project will cost no more and no less than Y regardless of overruns or deadlines.

Except for the change orders.  Which modify Y and the Deadline.

Absolute, strict, final and non-negotiable deadline for complete delivery of all work.

"non-negotiable" is generally not true.  It's negotiable.  It's just painful to negotiate.

The important part of negotiating with government agencies is the fact that you need "lawyer-level evidence" for your cost and schedule changes.  A few careful technical presentations with a nice power-point slide isn't "evidence".  You need a lot of documentation to make your case.

The government folks need to provide unimpeachable evidence that they've done everything in their power to make this as cheap and effective as possible.  They know that every decision is replayed in the public press and scrutinized in hind-sight.

The complexity of software development, and the after-the-fact, "monday morning quarterback" aspect of government work makes them reluctant to make changes to the contract without overwhelming evidence.

It makes a properly Agile approach difficult.

"Individuals and interactions over processes and tools" is tough.  You aren't working with an individual, but a representative of the government who's job is constrained by process.


答: You are assuming the requirements are well written and you think they mean what they think they mean.  The back and forth of the agile process will help ensure they are getting what they meant in addition to what they asked for. </p>


答:
'Explain the login process in Linux, with as much detail as you feel comfortable' is a good question.  The login process happens to involve switching users, permissions and ownerships, and lots of general Unix philosophy.  If they can clearly explain the how and the why there's a /etc/passwd and /etc/shadow, and how a non-prived user can change their own password but not others', that means they 'get' Unix.

Another good one is anything with log parsing, or quick security audits.  If they can add up total bandwidth served out for a particular vhost out of an Apache log, or find if there are any other users in the system with a uid of 0, they're handy on the commandline.

And one thing to NOT do to them:  do not make them do it on paper/whiteboard.  Give them a live system (but no internet because that's almost cheating), and watch them go.  If they know their way around man pages and can build multi-pipe expressions on the fly, that's a good sign.  If they need google for everything, then their skillset is questionable.


问:
Virtualized Development Environments in Enterprise Networks
We are attempting to implement a development environment using virtualization for a small team of 4 developers within an enterprise organization.  This would allow us to set up separate development, testing, and staging environments - as well as allowing access to new operating systems that are requirements for systems or tools we are evaluating.   We re-purposed an existing workstation-class machine, threw in 24GB RAM and RAID-10, and were doing fine until we attempted to get the machine added to the domain.

Now we are beginning the war that all enterprise developers since the beginning of time have had to fight - the fight for local control of a development and testing environment.  The network and IT admins' have raised concerns ranging from "ESX Server is the enterprise standard" to "servers are not allowed on client VLANs" to "[fill-in-the-blank] is not a skill set currently possessed in the local or enterprise IT organization".

We could justify production-class hardware and formal IT support if we had to, but it would take time and involve a whole lot of headache.  Even then it might take months to formally get IT resources assigned by treating this as a production system - and even if we did, we would likely lose the local control we need.

I imagine that many of you have had similar struggles over developer control of non-production environments - and virtualization in particular - so my questions are as follows:

What strategies and arguments have helped you win over the infrastructure (IT & Network) folks to allow these types of silos to exist within enterprises which have standard network and security policies in place that would generally (and understandably) preclude this type of non-(centrally)-managed infrastructure?

Have you found this to be a matter of technical justification - or more of a political struggle for control and ownership?

If you ended up with a IT-managed development environment, how much of a roadblock has it been for day-to-day development and testing?

Has anyone ended up moving their development environment to a disconnected VLAN or entirely separate network to avoid these network access struggles?

Also, this is not a Hyper-V vs. ESX holy war (we would be fine with either - but Hyper-V was selected since it is "free" with MSDN for these purposes [yes, VMWare has free tools too - but the good management tools generally aren't], and would be easier to manage by the local developers in a "Microsoft Shop") - so arguments for or against either are outside the scope of this question.

This is also less of a virtualization vs. physical hardware - I suppose the same question could be asked without the virtualization component to the equation.

Also assume that the dev team has already made assurances to either manage patch management and antivirus, or integrate with the existing enterprise systems if they will support it.
This scenario, with different questions, is also posted on SF to hopefully elicit the opposing viewpoint.

答:
You've gone "off the reservation", and are trying to justify it.

This isn't about virtualization; It's about control and responsibility. The IT department has responsibility for the safety and reliability of the company's systems. To make sure they work, IT keeps them under their own control. You've built a system not under the control of IT, and it's now becoming a problem.

The usual reasons programmers want their own systems, in my experience, is:

IT is not responsive. It takes weeks to get a new environment, but you need one now.

You need control; They won't give it to you. You need to be able to set permissions, install components, etc. IT won't let you.

Ultimately, when you go to production, you will want an IT-managed system that's completely locked down. But while you're developing, you need flexibility. Some suggestions:

Make Friends. get to know some people in IT; Talk to them face to face. Explain your situation and ask them what can be done. You may be able to get admin rights to a dev server simply by asking.

Run Local. If you can run portions of the application on your local machines, you may not need a server, or you can get away with a locked-down DB instance.

Get a Sponsor. Nothing gets IT moving like a VP coming in and saying, "Why are you blocking my project?" Use your project sponsor's clout.

To the Cloud! If your project budget will cover it, just host on EC2 -- you bypass your entire IT department. The risks are getting hacked, and getting fired for letting company information outside the firewall.

Run the Long Game. Put in the requests for properly authorized and administered servers early. When you get complaints about your homebrew, say that you're still waiting on the official servers.

Preallocate. Request servers that you think you might need in the future. Then re-purpose them when you have actual needs.

OwnerDisplayName: ScottBai