diff --git a/.obsidian/command-palette.json b/.obsidian/command-palette.json index 2504481..58f1227 100644 --- a/.obsidian/command-palette.json +++ b/.obsidian/command-palette.json @@ -1,5 +1,3 @@ { - "pinned": [ - "editor:toggle-source" - ] + "pinned": null } \ No newline at end of file diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index 449a3fe..e2c34eb 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -25,6 +25,5 @@ "neighbouring-files", "cmdr", "sheets", - "tabout", - "obsidian-tidy-footnotes" + "tabout" ] \ No newline at end of file diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json index cb5e4e4..d1cbef2 100644 --- a/.obsidian/core-plugins.json +++ b/.obsidian/core-plugins.json @@ -11,7 +11,7 @@ "page-preview": true, "daily-notes": false, "templates": false, - "note-composer": true, + "note-composer": false, "command-palette": true, "slash-command": false, "editor-status": true, diff --git a/.obsidian/plugins/obsidian-tidy-footnotes/main.js b/.obsidian/plugins/obsidian-tidy-footnotes/main.js deleted file mode 100644 index 1793582..0000000 --- a/.obsidian/plugins/obsidian-tidy-footnotes/main.js +++ /dev/null @@ -1,189 +0,0 @@ -/* -THIS IS A GENERATED/BUNDLED FILE BY ESBUILD -if you want to view the source, please visit the github repository of this plugin -*/ - -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// src/main.ts -var main_exports = {}; -__export(main_exports, { - default: () => TidyFootnotes -}); -module.exports = __toCommonJS(main_exports); -var import_obsidian = require("obsidian"); - -// src/tidyFootnotes.ts -var reKey = /\[\^(.+?(?=\]))\]/gi; -var reDefinition = /^\[\^([^\]]+)\]\:/; -function isNumeric(value) { - return !isNaN(value - parseFloat(value)); -} -function tidyFootnotes(editor) { - let markers = []; - let definitions = /* @__PURE__ */ new Map(); - let firstDefinitionLine = -1; - let definitionsIndexed = /* @__PURE__ */ new Map(); - const lineCount = editor.lineCount(); - let prevKey = ""; - for (let i = 0; i < lineCount; i++) { - const line = editor.getLine(i); - let isDefinition = false; - let match; - if (prevKey.length) { - const hasIndent = /^[ \t]/.test(line); - const isLastLine = i === lineCount - 1; - if (hasIndent || line.length === 0 && !isLastLine) { - const value = definitions.get(prevKey); - definitions.set(prevKey, value + "\n" + line); - markers[markers.length - 1].length++; - continue; - } else { - prevKey = ""; - } - } - while ((match = reDefinition.exec(line)) !== null) { - if (match.length < 1) - return; - isDefinition = true; - let key = match[1]; - let value = line.substring(match[0].length); - definitions.set(key, value); - prevKey = key; - let marker = { - key, - line: i, - index: 0, - length: 0, - isDefinition: true - }; - markers.push(marker); - if (firstDefinitionLine === -1) { - firstDefinitionLine = i; - } - break; - } - if (isDefinition) - continue; - while ((match = reKey.exec(line)) !== null) { - if (match.length < 1) - return; - let key = match[1]; - let marker = { - key, - line: i, - index: match.index, - length: match[0].length, - isDefinition: false - }; - markers.push(marker); - if (!definitionsIndexed.has(key)) { - definitionsIndexed.set(key, { - key, - newKey: key, - isNumber: isNumeric(key), - value: "" - }); - } - } - } - definitions.forEach((value, key) => { - definitionsIndexed.set(key, { - key, - newKey: key, - isNumber: isNumeric(key), - value - }); - }); - let count = 1; - let definitionsStr = ""; - definitionsIndexed.forEach((definition, marker) => { - let key = definition.key; - if (definition.isNumber) { - const current = definitionsIndexed.get(marker); - key = count.toString(); - definitionsIndexed.set(marker, { - ...current, - newKey: key - }); - count++; - } - definitionsStr += `[^${key}]:${definition.value} -`; - }); - const markersCount = markers.length; - for (let i = markersCount - 1; i >= 0; i--) { - const marker = markers[i]; - const markerLine = marker.line; - if (marker.isDefinition) { - let rangeStart, rangeEnd; - const lineEnd = markerLine + 1 + marker.length; - if (lineEnd === editor.lineCount()) { - rangeStart = { line: markerLine, ch: 0 }; - rangeEnd = { line: lineEnd - 1, ch: Infinity }; - } else { - rangeStart = { line: markerLine, ch: 0 }; - rangeEnd = { line: lineEnd, ch: 0 }; - } - if (markerLine === firstDefinitionLine) { - editor.replaceRange(definitionsStr, rangeStart, rangeEnd); - continue; - } - editor.replaceRange("", rangeStart, rangeEnd); - continue; - } - const definition = definitionsIndexed.get(marker.key); - const newKey = definition.newKey; - if (marker.key === newKey) - continue; - const line = editor.getLine(markerLine); - const prefix = line.substring(0, marker.index); - const newMarker = `[^${newKey}]`; - const suffix = line.substr(marker.index + marker.length); - const newLine = prefix + newMarker + suffix; - editor.replaceRange( - newLine, - { line: markerLine, ch: 0 }, - { line: markerLine, ch: Infinity } - ); - } - if (firstDefinitionLine == -1) { - const lineCount2 = editor.lineCount(); - editor.replaceRange( - "\n\n" + definitionsStr, - { line: lineCount2, ch: 0 }, - { line: lineCount2, ch: Infinity } - ); - } -} - -// src/main.ts -var TidyFootnotes = class extends import_obsidian.Plugin { - async onload() { - this.addCommand({ - id: "tidy-footnotes", - name: "Tidy Footnotes", - editorCallback: (editor, view) => { - tidyFootnotes(editor); - } - }); - } -}; - -/* nosourcemap */ \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-tidy-footnotes/manifest.json b/.obsidian/plugins/obsidian-tidy-footnotes/manifest.json deleted file mode 100644 index 9ea2e7d..0000000 --- a/.obsidian/plugins/obsidian-tidy-footnotes/manifest.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "id": "obsidian-tidy-footnotes", - "name": "Tidy Footnotes", - "version": "0.1.2", - "minAppVersion": "0.11.13", - "description": "Tidy your footnotes seamlessly.", - "author": "Charlie Chao", - "authorUrl": "https://github.com/charliecm", - "fundingUrl": "https://www.buymeacoffee.com/charliecm", - "isDesktopOnly": false -} \ No newline at end of file diff --git a/project-management-institute.md b/project-management-institute.md new file mode 100644 index 0000000..451207e --- /dev/null +++ b/project-management-institute.md @@ -0,0 +1,10 @@ +--- +aliases: + - PMI + - Project Management Institute (PMI) +title: Project Management Institute (PMI) +tags: [] +--- +# Project Management Institute (PMI) + +[The Project Management Institute](https://pmi.org) diff --git a/project-management-tm-for-construction.md b/project-management-tm-for-construction.md new file mode 100644 index 0000000..d1ea487 --- /dev/null +++ b/project-management-tm-for-construction.md @@ -0,0 +1,78 @@ +--- +title: Project Management™ for Construction +tags: [] +--- +# Project Management™ for Construction + +This note discusses the applicability (or lack thereof) +of [[project-management-tm]] in [[construction-contracting]]. + +... +That's not to say that it should be overlooked in construction applications. +There's no better source for solutions to problems that our industries share. +Specialized practices like [[lean-construction]] +are decades behind [[project-management-institute|PMI]]. +However, consulting Project Management™ for relevant insight +requires acknowledging its biases. + +## Limitations + +### Labor Management + +Project Management™ assumes workforce deficits are difficult to fill, +and that significant changes are sign of process failure. + +* Qualified employees are hard to find +* Project onboarding is extensive +* Diminishing returns start early and are severe + +In construction projects, labor is highly dynamic. +Workforce necessarily varies greatly through the project's lifespan, +and labor reallocation is a regular (weekly) task. + +* Qualified employees are relatively plentiful, cost is the bottleneck + +* Onboarding is practically nonexistent, + new employees are productive on their first day + +* Diminishing returns start late and are less pronounced + +### Basis of Progress + +If you assume that labor is a strong predictor of cost, +and that your audience can convert between them implicitly, +then hours convey both schedule _and_ cost by their nature. + +Project Management™ is primarily concerned with _schedule_, +because it assumes that labor is a strong predictor of cost. + +* Labor is the greatest (if not only) project cost. +* Labor (and therefore cost) is effectively fixed for a given scope. + +As such, Project Managers™ may discuss project cost in hours, +with no loss of detail. + +In construction projects, labor is known to be a weak predictor of cost. + +* Labor is almost always a minority of project cost. +* Functionally equal options have a large spread + of possible hours-to-complete and total cost values. + +As such, construction project managers must discuss project cost directly. + +I believe this difference is one purely of language, +and doesn't represent a difference in philosophy. +However, it does speak to Project Management™'s tendency to overgeneralize. + +### Material + +The use of labor as a measure of cost is not a difference of philosophy itself, +however Project Management™ is only able to get away with conflating labor and cost +because it assumes Material cost is negligible, +or that it can be allocated as overhead. + +What I'm calling Material cost +refers to direct costs not associated with labor. +These costs vary wildly, +even independent of installation requirements, +due to [[gold-plating]] and owner furnished scope. diff --git a/project-management-tm.md b/project-management-tm.md index 6a242d8..de78d40 100644 --- a/project-management-tm.md +++ b/project-management-tm.md @@ -11,19 +11,20 @@ tags: ## TALK +This note may include generic criticism, +but discussion of the applicability (or lack thereof) +of Project Management™ to construction specifically +should be relegated to [[project-management-tm-for-construction]] + %% This note is distinguished from [[project-management]] by referring specifically to doctrine/curriculum, -especially as documented by [The Project Management Institute](htpps://pmi.org). +especially as documented by [[project-management-institute|PMI]]. I've opted to humorously style this concept as Project Management™ for clarity. -That is, "Project management" could never be wrong or even misguided, +That is, "project management" could never be wrong or even misguided, but Project Management™ can (and often is). -This note may include generic criticism, -but discussion of the applicability (or lack thereof) -of Project Management™ to construction specifically - ## Criticism The term "Project Management" is deliberately vague, @@ -33,8 +34,9 @@ maximizes its applicability across industries. There are many core Project Management™ ideas that have no parallel in other industries, and industries often have problems of project management -that Project Management™ doctrine has no good solutions for. -See [[project-management-tm-for-construction]] for examples. +that Project Management™ doctrine has no good solutions for.[^1] + +[^1]: See [[project-management-tm-for-construction]]. I would posit that, despite its cross-discipline language, Project Management™ practice is only _universally_ applicable @@ -45,72 +47,4 @@ to _software_ project management. > humorously points out > that PMI may not be in touch with _any_ part of its audience > if they are able to release a publication "3 years overdue" -> without embarrassment.[^1] - -[^1]: p. 103 - -That's not to say that it should be overlooked in construction applications. -There's no better source for solutions to problems that our industries share. -Specialized practices like [[lean-construction]] are decades behind PMI. -However, consulting Project Management™ for relevant insight -requires acknowledging its biases. - -## Key Differences from Construction - -### Labor Management - -Project Management™ assumes workforce deficits are difficult to fill, -and that significant changes are sign of process failure. - -* Qualified employees are hard to find -* Project onboarding is extensive -* Diminishing returns start early and are severe - -In construction projects, labor is highly dynamic. -Workforce necessarily varies greatly through the project's lifespan, -and labor reallocation is a regular (weekly) task. - -* Qualified employees are relatively plentiful, cost is the bottleneck -* Onboarding is practically nonexistent, - new employees are productive on their first day -* Diminishing returns start late and are less pronounced - -### Basis of Progress - -If you assume that labor is a strong predictor of cost, -and that your audience can convert between them implicitly, -then hours convey both schedule _and_ cost by their nature. - -Project Management™ is primarily concerned with _schedule_, -because it assumes that labor is a strong predictor of cost. - -* Labor is the greatest (if not only) project cost. -* Labor (and therefore cost) is effectively fixed for a given scope. - -As such, Project Managers™ may discuss project cost in hours, -with no loss of detail. - -In construction projects, labor is known to be a weak predictor of cost. - -* Labor is almost always a minority of project cost. -* Functionally equal options have a large spread - of possible hours-to-complete and total cost values. - -As such, construction project managers must discuss project cost directly. - -I believe this difference is one purely of language, -and doesn't represent a difference in philosophy. -However, it does speak to Project Management™'s tendency to overgeneralize. - -### Material - -The use of labor as a measure of cost is not a difference of philosophy itself, -however Project Management™ is only able to get away with conflating labor and cost -because it assumes Material cost is negligible, -or that it can be allocated as overhead. - -What I'm calling Material cost -refers to direct costs not associated with labor. -These costs vary wildly, -even independent of installation requirements, -due to [[gold-plating]] and owner furnished scope. +> without embarrassment. (p. 103)