Back to Blog
PAPA Development Journal [Day 5/7] - Product Management in Practice: Balancing Engineer and PM Dual Roles
📋 Case Study

PAPA Development Journal [Day 5/7] - Product Management in Practice: Balancing Engineer and PM Dual Roles

B
Blake
Oct 3, 2025 By Blake 52 min read
As Blake Lab's cultural-technology integration experiment, Day 5 dives deep into product management practice, exploring how to balance the dual roles of engineer and product manager in solo development, driving PAPA system iteration optimization through user feedback.

🎯 Today's Challenge: One Person Playing Two Roles in Product Development

After four days of technical implementation, the PAPA system has complete core functionality. But the real challenge is just beginning: How to switch from engineer mindset to product manager perspective, ensuring technical implementation truly solves user problems?

This transition reveals the core contradiction of independent developers:

  • Engineers pursue technical perfection, PMs focus on user value

  • Technical debt vs feature iteration priority choices

  • Complex functionality vs simple usability design philosophy

  • Development efficiency vs user experience balance point

🔄 Role Switching: From Code Review to User Story

Engineer Perspective vs PM Perspective Thinking Comparison

Through PAPA development battle, I deeply experienced the differences between two thinking modes:

// Engineer mindset: Technology-first design
class ExpenseManager {
  // Pursuing perfect abstraction and scalability
  async createExpense(
    data: CreateExpenseRequest,
    options: {
      optimisticUpdate?: boolean
      retryOnFailure?: boolean
      cacheStrategy?: 'aggressive' | 'conservative'
      conflictResolution?: 'merge' | 'override' | 'prompt'
    }
  ) {
    // Complex logic handling...
    return this.executeWithOptions(data, options)
  }
}

// PM mindset: User-first design  
const QuickExpenseAdd = () => {
  // Pursuing simplest user flow
  const addExpense = async (amount: number, category: string) => {
    // One-click completion, handling all complex logic behind scenes
    return await simpleAddExpense({ amount, category })
  }
  
  return (
    <Button 
      size="large"
      onClick={() => addExpense(amount, selectedCategory)}
    >
      Add Expense
    </Button>
  )
}

Core Differences:

  • Engineer: "This API supports 8 configuration options, very flexible!"

  • PM: "Aunt only needs one button to record expenses, nothing else matters."

User Story-Driven Feature Prioritization

// Converting technical requirements to user stories
interface UserStory {
  asA: string          // As a...
  iWant: string        // I want...
  soThat: string       // So that...
  priority: 'high' | 'medium' | 'low'
  techComplexity: 'simple' | 'medium' | 'complex'
  userValue: number    // 1-10 scale
}

const userStories: UserStory[] = [
  {
    asA: "tribal elder",
    iWant: "use large fonts on computer for accounting",
    soThat: "I can operate clearly without reading glasses",
    priority: 'high',
    techComplexity: 'simple',
    userValue: 9
  },
  {
    asA: "event organizer", 
    iWant: "one-click export of government format reports",
    soThat: "I don't need to reorganize data when applying for subsidies",
    priority: 'high',
    techComplexity: 'medium',
    userValue: 10
  },
  {
    asA: "young tribal member",
    iWant: "quickly record expenses on mobile",
    soThat: "I can record without interrupting conversations at events",
    priority: 'medium',
    techComplexity: 'simple', 
    userValue: 7
  }
]

// Priority calculation formula
const calculatePriority = (story: UserStory) => {
  const complexityWeight = {
    'simple': 1,
    'medium': 2, 
    'complex': 4
  }
  
  // User value / Technical complexity = ROI
  return story.userValue / complexityWeight[story.techComplexity]
}

PM Insight: The highest value features are often technically simplest, but engineers most easily overlook them.

📊 Agile Development's Real-World Application in Cultural Technology

Sprint Planning: Cultural Sensitivity Priority

In PAPA development, I adopted a modified Scrum method, adding "Cultural Impact Assessment":

# Cultural Tech modified version of Sprint Planning
class CulturalTechSprint:
    def __init__(self):
        self.cultural_consultant = "tribal_elders"  # Essential role
        self.tech_sprint_length = 7  # 7-day iteration
        self.user_feedback_sessions = 2  # Two feedback sessions per Sprint
    
    def plan_sprint(self, backlog_items):
        prioritized_items = []
        
        for item in backlog_items:
            # Technical feasibility assessment (engineer role)
            tech_score = self.assess_technical_feasibility(item)
            
            # Cultural suitability assessment (PM role)
            culture_score = self.assess_cultural_fit(item)
            
            # User impact assessment
            user_impact = self.assess_user_impact(item)
            
            # Comprehensive scoring: Cultural suitability weighted highest
            priority_score = (
                culture_score * 0.4 +  # Cultural suitability 40%
                user_impact * 0.35 +   # User impact 35%
                tech_score * 0.25      # Technical feasibility 25%
            )
            
            prioritized_items.append({
                'item': item,
                'priority': priority_score,
                'cultural_notes': self.get_cultural_considerations(item)
            })
        
        return sorted(prioritized_items, key=lambda x: x['priority'], reverse=True)
    
    def assess_cultural_fit(self, feature):
        """Assess whether feature fits Indigenous group usage habits"""
        criteria = {
            'respects_elder_authority': 0,      # Respects elder authority
            'supports_group_harmony': 0,       # Promotes group harmony
            'preserves_transparency': 0,       # Maintains financial transparency
            'accessible_to_all_ages': 0        # Accessible across age groups
        }
        
        # Specific assessment logic...
        return sum(criteria.values()) / len(criteria)

Cultural Tech Sprint Special Considerations:

  • Elder participation: Every Sprint must have tribal elder usage feedback

  • Transparency first: Financial function transparency more important than privacy settings

  • Collective decision: Major feature changes need community consensus

  • Traditional respect: Digitalization cannot break existing decision-making processes

Real-Time User Feedback Collection and Analysis

// Built-in user feedback system
interface UserFeedback {
  user_role: 'elder' | 'event_organizer' | 'young_member'
  feature_used: string
  satisfaction_score: number  // 1-5 scale
  difficulty_rating: number   // 1-5 scale (5=very difficult)
  suggestions: string
  would_recommend: boolean
  timestamp: Date
}

class FeedbackAnalyzer {
  async collectRealTimeFeedback() {
    // Auto-popup simple rating after user completes operation
    return new Promise((resolve) => {
      showFeedbackModal({
        title: 'How was that operation?',
        questions: [
          { type: 'emoji', question: 'Satisfaction?', options: ['😞', '😐', '😊', '😍'] },
          { type: 'emoji', question: 'Difficulty?', options: ['👶', '🧒', '🧑', '👨‍🦳', '😵'] },
          { type: 'text', question: 'Any suggestions?', placeholder: 'Areas for improvement...' }
        ],
        onSubmit: resolve
      })
    })
  }
  
  async analyzeFeedbackTrends() {
    const feedbacks = await this.getFeedbackByRole()
    
    // Analyze pain points by user role
    const elderPainPoints = feedbacks
      .filter(f => f.user_role === 'elder')
      .filter(f => f.difficulty_rating >= 4)
      .map(f => f.feature_used)
    
    // Prioritize fixing features elders find difficult
    return {
      urgentFixes: elderPainPoints,
      satisfaction: this.calculateAverageSatisfaction(),
      recommendations: this.generateProductRecommendations()
    }
  }
}

Feedback-Driven Product Iteration Examples:

  1. Week 1 Feedback: "Adding expense takes 3 clicks to complete, too complex"

    • Engineer thinking: "Three steps is reasonable, data validation needs these steps"

    • PM decision: Simplify to one-step completion, auto-handle validation behind scenes

  2. Week 2 Feedback: "Can't understand split results, don't know who should pay how much"

    • Engineer thinking: "Algorithm is correct, show all calculation details"

    • PM decision: Hide calculation process, only show final result with simple explanation

  3. Week 3 Feedback: "Mobile buttons too small, can't press with presbyopia"

    • Engineer thinking: "Button size follows Material Design standards"

    • PM decision: Enlarge buttons to 48px in elder mode, standards yield to usability

🧪 Innovative Application of A/B Testing in Cultural Technology

Culturally-Sensitive A/B Test Design

// A/B testing framework considering cultural factors
class CulturalABTest {
  async runCulturallyAwareTest(feature: string, variants: Variant[]) {
    const testGroups = await this.createCulturallyBalancedGroups()
    
    // Ensure each test group has representatives from different age groups
    const balancedGroups = testGroups.map(group => ({
      ...group,
      participants: this.ensureAgeBalance(group.participants),
      cultural_context: this.addCulturalContext(group)
    }))
    
    // Run tests with cultural observers
    const results = await Promise.all(
      balancedGroups.map(group => 
        this.runTestWithCulturalObserver(feature, group)
      )
    )
    
    return this.analyzeCulturalResults(results)
  }
  
  analyzeCulturalResults(results: TestResult[]) {
    return {
      // Quantitative metrics
      conversion_rates: results.map(r => r.conversionRate),
      completion_times: results.map(r => r.avgCompletionTime),
      
      // Qualitative observations (more important)
      cultural_observations: [
        "Elders prefer confirmation dialogs, feel safer",
        "Young people like real-time updates, dislike waiting",
        "In group use, transparency more important than privacy"
      ],
      
      // Cultural recommendations
      recommendations: [
        "Keep confirmation steps elders like",
        "Provide quick mode option for young people", 
        "Add operation visibility features"
      ]
    }
  }
}

Actual A/B Test Cases:

Test Case: Split Result Display Method

Version A: Detailed calculation process

Ming should pay: $1,250
Calculation: (Total expense $5,000 ÷ 4 people) = $1,250
Ming already paid: $800  
Difference: $1,250 - $800 = $450 (needs to supplement)

Version B: Simplified result display

Ming needs to supplement $450
(Paid $800, should pay $1,250)

Test Results:

  • Elder group: 70% prefer Version A (want to understand calculation process)

  • Young group: 85% prefer Version B (just want results)

PM Decision: Provide toggle option, default to simplified version, but keep "Show calculation process" button.

🎨 Design System: Visual Language of Cultural Technology

Indigenous Group-Friendly Design Language

// PAPA Design System - Culturally sensitive design variables
:root {
  // Color system: Derived from traditional Indigenous colors
  --primary-mountain: #2E8B57;        // Forest green: safe, natural
  --secondary-ocean: #5F9EA0;         // Ocean blue: open, flowing  
  --accent-sunset: #FF8C42;           // Sunset orange: warm, gathering
  --neutral-stone: #8B8680;           // Stone gray: stable, traditional
  
  // Font system: Considering Chinese reading habits
  --font-family-primary: 'Noto Sans TC', sans-serif;
  --font-size-elder: 1.2rem;          // Elder-friendly
  --font-size-standard: 1rem;         // Standard size
  --font-size-compact: 0.875rem;      // Compact display
  
  // Spacing system: Touch-friendly
  --spacing-touch-target: 48px;       // Minimum touch target
  --spacing-comfortable: 24px;        // Comfortable spacing
  --spacing-cozy: 16px;               // Tight spacing
  
  // Shadow system: Fitting Indigenous aesthetics
  --shadow-subtle: 0 2px 8px rgba(46, 139, 87, 0.1);
  --shadow-prominent: 0 4px 16px rgba(46, 139, 87, 0.2);
}

// Culturally adapted component variants
.button {
  // Base styles
  padding: var(--spacing-comfortable);
  font-family: var(--font-family-primary);
  border-radius: 8px;
  
  // Elder-friendly variant
  &.elder-friendly {
    font-size: var(--font-size-elder);
    min-height: var(--spacing-touch-target);
    background: var(--primary-mountain);
    color: white;
    
    // Clear visual feedback
    &:hover {
      transform: scale(1.05);
      box-shadow: var(--shadow-prominent);
    }
  }
  
  // Young people's preferred variant
  &.modern {
    font-size: var(--font-size-standard);
    background: linear-gradient(135deg, var(--secondary-ocean), var(--accent-sunset));
    
    &:hover {
      opacity: 0.9;
    }
  }
}

Cultural Considerations in Design Decisions:

  • Color choices: Avoid red (represents taboos in some Indigenous cultures)

  • Icon design: Use universally recognized symbols, avoid culture-specific patterns

  • Text content: Traditional Chinese priority, preserve key Indigenous language terms

  • Operation flow: Respect hierarchical social structure

📈 Data-Driven Product Decision Framework

Mixed Quantitative and Qualitative Analysis Method

# Product decision data analysis framework
class ProductAnalytics:
    def __init__(self):
        self.quantitative_metrics = [
            'user_engagement_rate',      # User engagement rate
            'feature_adoption_rate',     # Feature adoption rate  
            'task_completion_rate',      # Task completion rate
            'error_recovery_rate'        # Error recovery rate
        ]
        
        self.qualitative_indicators = [
            'user_sentiment_feedback',   # User sentiment feedback
            'cultural_appropriateness',  # Cultural appropriateness
            'community_acceptance',      # Community acceptance
            'elder_confidence_level'     # Elder operation confidence
        ]
    
    def analyze_feature_performance(self, feature_name: str):
        # Quantitative analysis
        quant_data = self.get_quantitative_data(feature_name)
        
        # Qualitative analysis: Field observation records
        qual_data = {
            'observation_notes': [
                "Grandma asks nearby people for confirmation when using export function",
                "Young people try first, elders like to watch others operate first",
                "During group use, everyone gathers to discuss if results are correct"
            ],
            'cultural_insights': [
                "Financial transparency extremely important to Indigenous communities",
                "Elder approval is key indicator of feature success", 
                "Collective decision-making process needs to be considered in tech design"
            ]
        }
        
        return self.synthesize_insights(quant_data, qual_data)
    
    def generate_product_recommendations(self, analysis_result):
        """Generate product recommendations based on mixed analysis"""
        recommendations = []
        
        # If elder satisfaction is low, this is highest priority
        if analysis_result['elder_satisfaction'] < 7:
            recommendations.append({
                'priority': 'critical',
                'action': 'Immediately optimize elder user experience',
                'reason': 'Elder satisfaction directly affects entire community adoption'
            })
        
        # If feature usage is low but technically sound, consider UX issues
        if (analysis_result['adoption_rate'] < 0.3 and 
            analysis_result['technical_quality'] > 8):
            recommendations.append({
                'priority': 'high',
                'action': 'Redesign user workflow',
                'reason': 'Technology is fine, but users can\'t find or don\'t know how to use'
            })
        
        return recommendations

Actual Decision Cases:

Case: Expense Category Function Iteration

Version 1 (Engineer mindset):

  • Provide 20+ detailed categories

  • Customizable categories and subcategories

  • Support multi-level category architecture

User Feedback:

  • Elders: "Too many options, don't know which to choose"

  • Young people: "Takes too long to find each time, troublesome"

Version 2 (PM mindset):

  • Simplified to 4 main categories: Food, Transport, Accommodation, Other

  • Most used items at front

  • Provide "Recently Used" quick options

A/B Test Results:

  • Operation completion time: 120s → 15s (87% improvement)

  • User satisfaction: 6.2 → 8.7 (40% improvement)

  • Elder independent completion rate: 45% → 89% (98% improvement)

🤝 Cross-Generational Collaboration Product Design Philosophy

Technical Implementation of Inclusive Design

// Systematic support for cross-generational user preferences
class InclusiveDesignManager {
  private userPreferences: Map<string, UserPreference>
  
  async adaptToUser(userId: string) {
    const user = await this.getUserProfile(userId)
    const preferences = await this.inferPreferences(user)
    
    // Adjust interface based on age and usage habits
    if (preferences.age >= 60) {
      this.enableElderMode({
        fontSize: 'large',
        buttonSize: 'extra-large', 
        animationSpeed: 'slow',
        confirmationDialogs: 'enabled'
      })
    }
    
    if (preferences.techExperience === 'beginner') {
      this.enableGuidedMode({
        showTooltips: true,
        stepByStepGuides: true,
        undoAlwaysVisible: true
      })
    }
    
    // Cultural preference adaptation
    if (preferences.culturalBackground === 'indigenous') {
      this.enableCulturalMode({
        colorScheme: 'earth-tones',
        terminology: 'community-focused',  // "Our expenses" vs "My expenses"
        decisionFlow: 'consensus-based'     // Important decisions need confirmation
      })
    }
  }
  
  // Dynamically adjust feature exposure
  async adjustFeatureVisibility(userSegment: string) {
    const featureMap = {
      'elder': [
        'large-text-mode',      // Large text mode
        'simple-add-expense',   // Simplified add
        'export-to-excel',      // Excel export
        'call-for-help'         // Help button
      ],
      'young': [
        'quick-add',            // Quick add
        'batch-operations',     // Batch operations
        'advanced-analytics',   // Advanced analytics
        'sharing-features'      // Sharing features
      ],
      'leader': [
        'event-management',     // Event management
        'user-permissions',     // Permission management
        'financial-reports',    // Financial reports
        'data-export'          // Data export
      ]
    }
    
    // Only show features most needed by this group
    return featureMap[userSegment] || featureMap['elder']  // Default elder-friendly
  }
}

🚀 Product Roadmap: Balancing Technical Debt vs New Features

Technical Debt Assessment and Repayment Strategy

// Product impact assessment of technical debt
interface TechnicalDebt {
  component: string
  severity: 'low' | 'medium' | 'high' | 'critical'
  user_impact: number      // Impact on users 1-10
  maintenance_cost: number // Maintenance cost 1-10  
  fix_effort: number       // Effort to fix 1-10
  business_risk: number    // Business risk 1-10
}

class TechnicalDebtManager {
  calculateDebtPriority(debt: TechnicalDebt): number {
    // PM perspective: User impact weighted highest
    const userImpactWeight = 0.4
    const businessRiskWeight = 0.3
    const maintenanceCostWeight = 0.2
    const fixEffortWeight = 0.1  // Effort weight lowest

    return (
      debt.user_impact * userImpactWeight +
      debt.business_risk * businessRiskWeight +
      debt.maintenance_cost * maintenanceCostWeight -
      debt.fix_effort * fixEffortWeight  // High effort gets lower priority
    )
  }
  
  async planDebtRepayment() {
    const debts = await this.identifyTechnicalDebts()
    const prioritizedDebts = debts
      .map(debt => ({
        ...debt,
        priority: this.calculateDebtPriority(debt)
      }))
      .sort((a, b) => b.priority - a.priority)
    
    // Allocate 30% of Sprint time to technical debt
    const sprintCapacity = 40  // 40 hours/week
    const debtBudget = sprintCapacity * 0.3  // 12 hours
    
    return this.allocateDebtWork(prioritizedDebts, debtBudget)
  }
}

Actual Technical Debt Decisions:

  1. Inconsistent API response formats

    • Engineer thinking: "Need to refactor entire API layer, takes 2 weeks"

    • PM assessment: Users unaware, low priority

    • Decision: Use adapter first, refactor next month

  2. Complex frontend state management

    • Engineer thinking: "Redux too complex, should switch to Zustand"

    • PM assessment: Functionality stable, users satisfied

    • Decision: New features use Zustand, old features unchanged

  3. Database query performance

    • Engineer thinking: "Performance okay, 200ms acceptable"

    • PM assessment: Users complain about slow loading, affects experience

    • Decision: Immediate optimization, handle this week

📱 Multi-Platform Product Strategy: Differentiation vs Consistency

Platform-Specific Product Positioning

// Product positioning strategy for different platforms
const platformStrategy = {
  desktop: {
    target_users: ['tribal_elders', 'event_organizers', 'accountants'],
    core_value: 'professional financial management',
    key_features: [
      'large-screen data analysis',
      'Excel report export', 
      'multi-window operations',
      'keyboard shortcuts'
    ],
    success_metrics: [
      'report generation success rate',
      'elder independent operation rate',
      'data input accuracy'
    ]
  },
  
  mobile: {
    target_users: ['young_members', 'event_participants'], 
    core_value: 'anytime, anywhere recording',
    key_features: [
      'one-tap quick recording',
      'photo receipt recording',
      'automatic location tagging',
      'social sharing'
    ],
    success_metrics: [
      'recording frequency',
      'photo usage rate', 
      'sharing interaction count'
    ]
  },
  
  web: {
    target_users: ['first_time_users', 'temporary_visitors'],
    core_value: 'zero-barrier experience',
    key_features: [
      'no installation required',
      'feature trials',
      'online tutorials',
      'QR code quick join'
    ],
    success_metrics: [
      'conversion to registered user rate',
      'tutorial completion rate',
      'referral sharing rate'
    ]
  }
}

Platform-Differentiated Feature Prioritization

# Product feature priority matrix across platforms
class PlatformFeaturePriority:
    def __init__(self):
        self.feature_matrix = {
            'expense_tracking': {
                'desktop': {'priority': 9, 'implementation': 'detailed_forms'},
                'mobile': {'priority': 10, 'implementation': 'quick_capture'},
                'web': {'priority': 8, 'implementation': 'demo_mode'}
            },
            'report_generation': {
                'desktop': {'priority': 10, 'implementation': 'full_featured'},
                'mobile': {'priority': 3, 'implementation': 'view_only'},  
                'web': {'priority': 5, 'implementation': 'preview_mode'}
            },
            'data_visualization': {
                'desktop': {'priority': 8, 'implementation': 'interactive_charts'},
                'mobile': {'priority': 6, 'implementation': 'simple_summaries'},
                'web': {'priority': 7, 'implementation': 'static_charts'}
            }
        }
    
    def get_platform_roadmap(self, platform: str):
        """Generate platform-specific feature roadmap"""
        features = []
        
        for feature_name, platforms in self.feature_matrix.items():
            if platform in platforms:
                feature_info = platforms[platform]
                features.append({
                    'name': feature_name,
                    'priority': feature_info['priority'],
                    'implementation': feature_info['implementation']
                })
        
        # Sort by priority
        return sorted(features, key=lambda x: x['priority'], reverse=True)

🎯 Today's Achievements and Key Insights

Product Management Battle Achievements

  • ✅ Established culturally-sensitive product decision framework

  • ✅ Implemented cross-generational user research methods

  • ✅ Designed inclusive A/B testing processes

  • ✅ Built data-driven feature prioritization system

  • ✅ Balanced technical debt with new feature development

  • ✅ Defined differentiated multi-platform product strategies

Key Insights from Dual Roles

  1. Empathy beats technical ability: Best product decisions come from deeply understanding user needs, not technical complexity

  2. Cultural sensitivity is competitive advantage: In cultural technology, understanding and respecting cultural context more important than pure technical innovation

  3. Elder satisfaction is success indicator: In family-type applications, elder acceptance directly determines entire product success

  4. Simple is more valuable than complete: 80% of users only need 20% of features, product design should reflect this reality

AI's Supporting Role in Product Management

  • User behavior analysis: GitHub Copilot helped generate analysis scripts

  • A/B test design: Claude 3.5 provided testing framework suggestions

  • User story writing: AI helped convert technical requirements to user language

  • But core product decisions: Still require human cultural understanding and empathy

🔮 Tomorrow's Preview

Day 6 will dive deep into Performance Optimization and Monitoring Battle, including:

  • Real-world performance bottleneck identification and resolution

  • Production environment monitoring system establishment

  • User experience-oriented performance optimization strategies

  • Special performance considerations for cultural technology applications

From product manager back to engineer, but carrying deeper user understanding. Technology serves people, product thinking makes technology more humane.


🚀 Blake Lab - Leading in Both AI and Cultural Technology
💡 20 years of government projects | 🤖 AI Indigenous applications | 🎯 Product strategy consulting | 📈 Cultural-sensitive design
🌐 wchung.tw | 📧 [email protected]

Follow Blake Lab to explore the infinite possibilities of technology and products together!

Enjoyed this article? Show some love!

0
Clap

Enjoyed this article?

Subscribe for engineering notes and AI development insights

We respect your privacy. No spam, unsubscribe anytime.

Share this article

Comments