{"id":18026780,"url":"https://github.com/yegor256/est","last_synced_at":"2026-02-24T21:31:08.646Z","repository":{"id":24787404,"uuid":"28201093","full_name":"yegor256/est","owner":"yegor256","description":"Estimates Automated","archived":false,"fork":false,"pushed_at":"2026-02-13T23:46:16.000Z","size":126,"stargazers_count":13,"open_issues_count":12,"forks_count":3,"subscribers_count":6,"default_branch":"master","last_synced_at":"2026-02-14T05:30:00.324Z","etag":null,"topics":["estimate","programmer","risk","ruby","skills"],"latest_commit_sha":null,"homepage":"https://rubygems.org/gems/est","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yegor256.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2014-12-18T20:50:54.000Z","updated_at":"2026-02-10T11:58:47.000Z","dependencies_parsed_at":"2025-05-05T14:44:08.384Z","dependency_job_id":"b0d88340-90f9-4cc1-bf28-aa85eb4c42b5","html_url":"https://github.com/yegor256/est","commit_stats":null,"previous_names":["teamed/est"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/yegor256/est","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yegor256%2Fest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yegor256%2Fest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yegor256%2Fest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yegor256%2Fest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yegor256","download_url":"https://codeload.github.com/yegor256/est/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yegor256%2Fest/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29801021,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T21:02:39.706Z","status":"ssl_error","status_checked_at":"2026-02-24T21:02:21.834Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["estimate","programmer","risk","ruby","skills"],"created_at":"2024-10-30T08:08:01.989Z","updated_at":"2026-02-24T21:31:08.599Z","avatar_url":"https://github.com/yegor256.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Managed by Zerocracy](http://www.zerocracy.com/badge.svg)](http://www.zerocracy.com)\n[![DevOps By Rultor.com](https://www.rultor.com/b/yegor256/est)](https://www.rultor.com/p/yegor256/est)\n[![We recommend RubyMine](https://www.elegantobjects.org/rubymine.svg)](https://www.jetbrains.com/ruby/)\n\n[![Build Status](https://travis-ci.org/yegor256/est.svg)](https://travis-ci.org/yegor256/est)\n[![Gem Version](https://badge.fury.io/rb/est.svg)](https://badge.fury.io/rb/est)\n[![Dependency Status](https://gemnasium.com/yegor256/est.svg)](https://gemnasium.com/yegor256/est)\n[![Code Climate](https://img.shields.io/codeclimate/github/yegor256/est.svg)](https://codeclimate.com/github/yegor256/est)\n[![Coverage Status](https://img.shields.io/coveralls/yegor256/est.svg)](https://coveralls.io/r/yegor256/est)\n\nInstall it first:\n\n```bash\n$ gem install est\n```\n\nRun it locally and read its output:\n\n```bash\n$ est --help\n```\n\nEvery estimate should be in its own file, with `.est` extension (YAML format).\nHere is an example of an estimate file `simple.est` for a simple web app:\n\n```yaml\ndate: 19-12-2017\nauthor: Yegor Bugayenko\nmethod: champions.pert\nscope:\n  1: basic Sinatra scaffolding\n  2: front-end HAML files\n  3: SASS stylesheet\n  4: five model classes + unit/integration tests\n  5: PostgreSQL migrations\nchampions:\n  2:\n    worst-case: 40\n    best-case: 10\n    most-likely: 18\n  5:\n    worst-case: 30\n    best-case: 8\n    most-likely: 16\n```\n\nAll estimates found in a directory will be combined and a final\nproject estimate will be produced:\n\n```bash\n$ est --dir=./est\nTotal: 27\n2014-12-19: 27 hours by Yegor Bugayenko\n```\n\n## Scope Champions\n\nScope Champions estimating method was introduced a\npatent application [US 12/193,010](https://www.google.com/patents/US20100042968).\nThis article explains it in more details:\n[Revolutionary Method Of Cost Estimating](http://www.technoparkcorp.com/innovations/scope-champions/).\nIn a nutshell, there are three steps.\n\nFirst, you break down the entire implementation scope into items, like\nit's done above, and list them under `scope`. Pay attention, you should list\nonly technical code-writing tasks. Testing, requirements analysis, thinking\nand talking should not go into this list. Imagive, what would you do\nif you would be the only programmer working with the product. Imagine, you\nhave to create the product from scratch, being the only programmer in house.\nIt is important to keep all work items on the same level of abstraction. This\nmeans that the complexity of all items should be approximately the same.\n\nSecond, select a few items from the list (2-3), which are the most difficult\nto implement. They are called \"scope champions\". List their numbers\nunder `champions`, as it's done above.\n\nThird, estimate that champions using [three-point estimating method](https://en.wikipedia.org/wiki/Three-point_estimation).\nAs in the example above, every scope champion should get three numbers.\nWorst case is how many hours you would spend on it, if everything would\nappear to be very difficult and most probable risks would happen. Best\ncase is how many hours would this work take if everything would go easy\nand without any risks. Most likely is how much would it take, in a normal\nsituation, according to your estimate.\n\n## Best Practices\n\n**Don't Look Back**. Try not to look into previous estimates\nmade in the project. It's tempting, but try to control yourself. Create\nyour own estimate first and then look at others that already exist in\nthe project.\n\n**Coding Time Only**. Estimate code writing time only. Don't estimate\ntime you would spend on discussions, thinking, modeling, diagramming,\ndocumenting etc. The estimate should count only the time you, as a single\nprogrammer in the project, would spend on code writing.\n\n**Estimate Regularly**. Re-estimate the entire project from scratch regularly.\nIn each estimate look at the project as a whole and estimate the entire\nscope. Not what's left, but the entire scope, as if you would need to\nre-create it all from scretch. Even if the project is close to its end,\ndon't stop re-estimating it.\n\n**Change Estimators**. Try to ask everybody in the project to estimate it\ntime to time (programmers only). Changing estimators will help the project\nto keep numbers out of bias.\n\n**Count On Your Skills**. Estimate the amount of work you would need to\ndevelop the product, not some abstract programmer. Rely on your personal\nskills, speed and expertise.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyegor256%2Fest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyegor256%2Fest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyegor256%2Fest/lists"}