TechLead
Lesson 19 of 30
5 min read
Project Management

Project Management Tools

Deep dive into Jira, Linear, Asana, Azure DevOps, and other PM tools with JQL examples, workflow configurations, and tool selection guidance

Choosing the Right PM Tool

The PM tool landscape is vast, and choosing the wrong tool can add friction instead of removing it. The best tool is one your team will actually use. Over-engineered tools create process overhead; under-featured tools force workarounds.

Tool Best For Team Size Complexity Price (per user/mo)
JiraEnterprise Agile, SAFe10-10,000+High$7.75-15.25
LinearFast-moving eng teams5-500Low-Medium$8-14
AsanaCross-functional teams5-5,000Medium$10.99-24.99
Azure DevOpsMicrosoft/.NET shops10-10,000+High$6-52
ShortcutMid-size eng teams5-500Medium$8.50-16
NotionFlexible, docs + PM1-500Low$8-15
Monday.comNon-technical teams5-5,000Low-Medium$9-19
TrelloSimple Kanban boards1-50Very LowFree-$17.50

Jira Deep Dive

Jira is the most widely used PM tool in software development, particularly for teams practicing Scrum or Kanban. Its power comes from its flexibility — but that flexibility also makes it complex.

-- JQL (Jira Query Language) Examples

-- Find all open bugs assigned to me
assignee = currentUser() AND type = Bug AND status != Done

-- Find stories in the current sprint
sprint in openSprints() AND type = Story

-- High-priority items not started in the last 7 days
priority in (High, Highest)
  AND status = "To Do"
  AND created <= -7d

-- Overdue items (past due date and not done)
duedate < now() AND status != Done
  ORDER BY duedate ASC

-- Stories completed in last sprint for velocity
sprint in closedSprints() AND type = Story AND status = Done
  AND sprint = "Sprint 42"

-- Find items without estimates
type = Story AND storyPoints is EMPTY
  AND sprint in openSprints()

-- Cross-project dependency search
issueLink = "is blocked by" AND project = "PLATFORM"

-- Bug aging report
type = Bug AND status != Done
  ORDER BY created ASC

-- Workload by assignee
type in (Story, Bug) AND sprint in openSprints()
  AND status != Done
  ORDER BY assignee
// Jira Workflow Configuration Model
interface JiraWorkflow {
  name: string;
  statuses: WorkflowStatus[];
  transitions: WorkflowTransition[];
}

interface WorkflowStatus {
  name: string;
  category: 'to-do' | 'in-progress' | 'done';
}

interface WorkflowTransition {
  name: string;
  from: string;
  to: string;
  conditions?: string[];
  validators?: string[];
  postFunctions?: string[];
}

const devWorkflow: JiraWorkflow = {
  name: 'Software Development Workflow',
  statuses: [
    { name: 'Backlog', category: 'to-do' },
    { name: 'Ready for Dev', category: 'to-do' },
    { name: 'In Development', category: 'in-progress' },
    { name: 'Code Review', category: 'in-progress' },
    { name: 'QA Testing', category: 'in-progress' },
    { name: 'Ready for Release', category: 'in-progress' },
    { name: 'Done', category: 'done' }
  ],
  transitions: [
    {
      name: 'Start Development',
      from: 'Ready for Dev',
      to: 'In Development',
      conditions: ['Assignee is set', 'Story points estimated'],
      postFunctions: ['Set start date to current date']
    },
    {
      name: 'Submit for Review',
      from: 'In Development',
      to: 'Code Review',
      conditions: ['PR link is attached'],
      validators: ['At least one subtask is complete']
    },
    {
      name: 'Approve Code',
      from: 'Code Review',
      to: 'QA Testing',
      conditions: ['PR approved by at least one reviewer'],
      postFunctions: ['Notify QA team']
    },
    {
      name: 'Pass QA',
      from: 'QA Testing',
      to: 'Ready for Release',
      conditions: ['All test cases passed']
    },
    {
      name: 'Fail QA',
      from: 'QA Testing',
      to: 'In Development',
      postFunctions: ['Add comment with defect details']
    },
    {
      name: 'Release',
      from: 'Ready for Release',
      to: 'Done',
      postFunctions: ['Set resolution to Done', 'Set completed date']
    }
  ]
};

Linear: The Modern Alternative

Why Teams Choose Linear

  • Speed: Linear is built for keyboard-first workflows. Everything is fast — no loading spinners.
  • Opinionated: Unlike Jira's infinite configurability, Linear provides sensible defaults that work out of the box.
  • Cycles: Linear's "Cycles" are similar to sprints but with automatic rollover and better tooling.
  • Roadmaps: Built-in roadmap views without plugins or add-ons.
  • GitHub Integration: First-class integration with Git workflows.

Tool Selection Criteria

  • Team Size: Small teams (< 20) often prefer lightweight tools (Linear, Shortcut). Large orgs need Jira or Azure DevOps.
  • Methodology: Scrum teams need sprint management. Kanban teams need WIP limits and flow metrics.
  • Integration: The tool must integrate with your code hosting (GitHub/GitLab), CI/CD, and communication tools (Slack).
  • Reporting: Stakeholders need dashboards and reports. Ensure the tool provides them natively or via API.
  • Adoption: The best tool is the one your team will actually use. A simple tool used consistently beats a powerful tool used poorly.

Continue Learning