Are there any software guarantees in critical systems? [closed] - algorithm

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
We don’t allow questions seeking recommendations for books, tools, software libraries, and more. You can edit the question so it can be answered with facts and citations.
Closed 6 years ago.
Improve this question
Are there systems or is there software out there that is developed with a proof of correctness to back it up? Or are all critical systems developed merely with an aggressive code review and test cycle?

Coding for high integrity applications, in the real world, generally involves jumping through a bunch of QA hoops. Sometimes these hoops actually have something to do with getting the software right.
The medical device industry in the USA is regulated by the FDA. They publish a bunch of regulations covering "design", which includes all the software development. These regulations are basically ISO 9000 on steroids. You have to have a bunch of documents which are written, marked up by reviewers, updated with the review comments and signed off by a senior manager. Because the regulations are backed by law the FDA want to see evidence that these records have not been tampered with, for instance by writing the "expected result" of a test after you saw what result the test gave. So you either have to have a locked down totally secure CM system, or it all has to be signed and dated on paper (including the source code). The FDA inspectors have real law enforcement powers; if they see fit they can inspect your source code with an armed federal marshal. However they are not software specialists: their job is not to judge the quality of your code, just to make sure you have complied with all the regulations.
The aviation industry has to follow DO-178B, which is also ISO-9000 on steroids. You have to produce lots of documents and demonstrate traceability between them. I don't know if the FAA has the same approach to QA as the FDA though.
The problem is that nobody really knows how to produce software that does what it is supposed to. So instead we have a kind of cargo cult approach where we produce lots of documentation in the hope that this will imbue our software with quality. Its true that quality software generally has clear requirements and a simple logical architecture, but that doesn't mean that writing a "Requirements Document" or an "Architecture Document" will improve matters.
The evidence suggests that factor with the biggest impact on code correctness is the team that created it. However you can't write a legal constraint on a team. So instead the people with the job of mandating quality have to write constraints on process instead, in the vague hope that this will have a similar effect.

See They Write The Right Stuff for an interesting look at how they develop software for the Space Shuttle.
Excerpt:
But how much work the software does is
not what makes it remarkable. What
makes it remarkable is how well the
software works. This software never
crashes. It never needs to be
re-booted. This software is bug-free.
It is perfect, as perfect as human
beings have achieved. Consider these
stats : the last three versions of the
program -- each 420,000 lines long-had
just one error each. The last 11
versions of this software had a total
of 17 errors. Commercial programs of
equivalent complexity would have 5,000
errors.

Yes, there are systems out there developed with proof of correctness. Praxis have been doing this for years using SPARK Ada, and now we're doing it with C and Escher C Verifier. It's not a panacea, because even though we prove that the code satisfies the specification, it's usually difficult to be certain that the specification is appropriate for the application concerned.
One of the barriers to more widespread adoption of formal proof is that the existing aviation software standard DO-178B is not friendly to formal techniques. The DO-178C rewrite currently in progress is supposed to fix that.

Check out this column by Walter Bright, basically arguing that it's virtually impossible to write perfect software, so the best thing to do is fail fast and build in redundancy.

Related

Have any commercial video games ever used Prolog? [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 7 years ago.
Improve this question
Have any commercial video games ever used Prolog? With is rules-based logic based model it seems like it have some place in the industry.
PS: as odd as this question is it still meets all the criteria for a question on SO.
Not a commercial game, but I was in a game jam just this last weekend, and we wrote the entire game (a small MMO) in Prolog. It's probably only a fantasy, but we discussed expanding the game into a game engine. That game engine would be rule based.
I guess I should add that I've worked on prolog systems that were near real time.
I work in the game industry and I doubt it very much. I have seen only one guy use prolog and it was for a build bot rule to automerge git branches into subproducts and overversions, and not in a game company.
That said, it could make sense for some fuzzy AI, but everything related to AI in the business is far from the research papers in practice. Real game developpers and producers hate unpredictability, basically for business reasons, today games are merely interactive movies.
Everything is on rail, scripted and controlled. Artists are very uncomnfortable with algorithmical rules, and game designers are artists. In my programmer's opinion, games with sophisticated AI must have beneficiated from a high ranking programmer in the company to push for it.
Or the game really required it, for example hitman. However if you see some of their talks (they have presentations at GDC, Cedec...) they say most of their work is empirical, and I tend to think by that, made in typical imperative programming.
Thirdly, you also get the problem of maintenance, and people knowing the language, which is.. few. Most of computer science graduates will have heard of it, followed some tutorial at the school/university but quickly forgotten about it anyway later. And you see, in game companies, a good percentage of programmers are self made, and even drop outs ! This leaves little room for prolog I can tell you that.
Lastly, you need to think about a technical point : performance. prolog underlying execution machine is somekind of a danger to real time. Because it has this simplex solver based on tree branches elimination heuristics which can run for god knows how long. Most games make scarse use of multi threading because of platforms limitation, or because of synchronization problems with the game data which has to be in synch on a by-frame basis for lots of things.

Good tutorials to understand Domain Specific Languages (DSLs) from the scratch , to start a survey thesis [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
We don’t allow questions seeking recommendations for books, tools, software libraries, and more. You can edit the question so it can be answered with facts and citations.
Closed 12 months ago.
Improve this question
My thesis topic is about Domain Specific languages in general, I want to focus on design or implementation for external or internal DSLs but I can't even think or start because I am facing problems with understanding the concept of DSLs ..
I have read and collected so many papers and surveys about this issue but all of them I consider as advanced.. I need a good tutorial ( for beginners ) to understand the whole concept and phases for DSLs from the scratch ..
I have read the first chapter for DSL by Martin Fowler , Fowler started with state machines and hard programming codes from the first page of his book and the problem is that I am not very good in programming in general, I have no experience, my thesis will be a survey about DSLs with no programming work. Until now I don't know what to focus on because the survey should be specific on on area like designing techniques or comparisons in designing or implementing , but because I cant get the big picture I can't even decide. Any suggestions about this issue also I will really appreciate that.
Please help me and thank you very much. I always look at the questions and answers in this great website and I believe that I will find a solution for my nightmare problem here!
Thanks a lot
Nat
This book is Bible for DSL's in my opinion. This book used to be free when it was in draft. You can also find other learning resources there.
Go through this post to find successful DSL's. This post might help you in identifying various flavors and various domains where they are being used.
It will be a lot of work for you if you want to understand it, so if you are not skillful with programming, learn it or choose easier thesis.
I wrote my thesis about model driven software development and domain specific languages withouth even a basic knowledge about modeling etc. It can be done, but I spent much time reading (which I enjoyed).
For the most basic introduction I would recommend se-radio.net podcast episodes 5 and 6 (...and there are many more about more advanced topics on MDSD/DSLs).
I'd read James Neighbors thesis, after reading his executive summary. He's the guy that defined the terms "domain analysis" and "domain engineering" in the context of defining "domain specific languages". And he shows a program generation system, Draco, that generates an astonishing variety of complex application codes based on these ideas. (The thesis is a lot more readable than you might expect, but expect to see some real code!).
You can read some history on this topic, too, and once again, how those who don't know their history are doomed to repeat it.

Tips for switching from A Project Manager to a Developer [closed]

Closed. This question is opinion-based. It is not currently accepting answers.
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 3 years ago.
Improve this question
I am currently trying to make the transition from a technical PM to a Developer.
Obviously this depends very much on current level of knowledge / experience, but are there some key things that a PM (who also codes regularly) might have missed from not strictly working as a Developer.
Also would a course like this help in the right direction?
http://www3.imperial.ac.uk/computing/teaching/postgraduate/msc-computing-science/description
Considering I want to work on Audio/Video/3D ideally, I feel this course could be a good leg up?
As a technical PM you have the advantage of knowing the terminology etc so that is at least a heads start. As to making the switch check out information on areas such as
computing fundamentals - low level concepts on computer hardware, network and protocols.
algorithms - for an understanding of sorting, graphs, networks, trees, etc.
architecture and design - web application architecture, messaging architecture, UML, use cases, documentation.
programming languages - OO, scripting and AI (at least to get a feel for the types and applications)
business end of programming - software estimation
This is a broad spectrum of areas that you would need to have at least some exposure to for the transition. In fact it might even be useful if your current employer allowed you to work as the developer on a small part of a project. You'd certainly gain respect from the developers on a project coming from the technical PM role and could even enlighten the developers.
If you have a passion for working in an area, seriously consider the amount of creative freedom, in your experience, developers have as compared to PMs. Make sure that's acceptable to you.
Nothing is worse than having passion in an area, but little or no influence.
As far as technical abilities go, the only thing to do is to code. Any classes primarily will act as ways to ensure that you do so, and do so in ways that will teach you. But at the end of the day, it's going to boil down to time spent writing software.
If you really want to become a great developer, learn at least one language radically different from the languages you know. If you're a Java/C++/C# kind of guy, learn something that will really torque your brain like Haskell, Erlang, or Scheme. To just learn really good OO techniques, learn, read, and write some Smalltalk.
The best thing to do is to spend ten years or so programming during every waking moment. That's what worked for me!
First of all get start practicing to type all day ! Then get ready to work on minute details which a developer works on everyday like... code shortcuts, coding styles, commenting etc.

Relationships between complexity theory and software engineering? [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
We don’t allow questions seeking recommendations for books, tools, software libraries, and more. You can edit the question so it can be answered with facts and citations.
Closed 5 years ago.
Improve this question
I'm interested to know if there is any literature out there on the relationship of complexity theory (emergence, complex systems, evolution) and software development processes. I read somewhere that SCRUM philosophy came out of the theory of punctuated equilibrium in evolution theory. Are there any additional studies/researches on this subject?
Thanks!
There's a slightly tongue-in-cheek book called Systemantics. Because a software program is a type of system, its observations are applicable to software: for example,
The bigger the system, the narrower and more specialized the interface with individuals.
A complex system cannot be "made" to work. It either works or it doesn't.
A simple system, designed from scratch, sometimes works.
Some complex systems actually work.
A complex system that works is invariably found to have evolved from a simple system that works.
A complex system designed from scratch never works and cannot be patched up to make it work. You have to start over, beginning with a working simple system.
There interesting blog posts by Jurgen Appelo of NOOP.NL fame, which are related to application of complexity theory to software engineering and project management:
Your Project Will Suffer From Power Laws
What (Else) Can Agile Learn from Complexity?
These can be helpful in researching this topic.

Tool or formula for calculating man-hours required for a project [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
We don’t allow questions seeking recommendations for books, tools, software libraries, and more. You can edit the question so it can be answered with facts and citations.
Closed 3 years ago.
Improve this question
Is there a tool or a formula for calculating man-hours required for a certain project? Either by specifying the details, either, even better, input the sources and have it calculate a measure of how many man-hours were put into the project.
Edit:
I often hear about big projects, with components built in parallel by numerous groups, that they took a couple of thousand man-hours to complete, but they were finished in just x days... probably an argument supporting the teams' efficiency... so I think it might be possible to at least estimate these measures. I am convinced that efforts were put into making these estimations automatic, and even though they might not reflect the actual time invested in the project, at least I'd like to know that the "state of the art" is in this kind of endeavour.
There is a whole science to this called Function Point Analysis.
Read through this introductory article.
Or try the Wikipedia article for more references and external links to follow up.
This technique is based on looking at the functions which are to be implemented in the software, and assigning a point count to them. Then you plan on how many points can be achieved per day to figure out a schedule.
There are also techniques that lean more on psychology which involve asking people to estimate the time of of individual tasks in a project with best, worst, most likely, cutting their estimates in half and padding out the end of the project with an unspecified buffer time which can be used for late running tasks, only if needed. This works by giving the developers a short timetable for results, but promising management/customers a longer timetable. It's called Critical Chain Project Management and has been used with success in defense projects.
Introduction to Critical Chain
Wikpedia article
Estimating the man-hours for a new project is more about experience than formulae. When I started programming there was this notional "10 lines per hour of debugged code" that was the yard stick but that figure varies hugely based on the type of code, the language and the experience/skill of the software engineer.
I suggest that you search the internet for articles on estimating software development projects, one example of such an article would be this How to estimate a software project in man-hours?. But it's by no means definitive but does demonstrate the complexities involved.
As for looking at some code and estimating, you might as well stick a wet finger in the air and guess. Only the programmers involved would know and even then I suspect the answer wouldn't be accurate. At the end of the day it's an estimate, not a quote or a fact, and as such often open to wild variations.
Unfortunately general the answer is no -- there is no, ready to use, formula to calculate man-hours for software project.
However, software project estimation, is a huge problem and there are a lot of ways to deal with it.
Many solutions are described in Steve McConnell's book Software Estimation: Demystifying the Black Art.
Steve's company offers also some resources and tools (some of them are free) which help to estimate software project.

Resources