By Fatskills Exam Guides Team — the exam nerds behind 28,500+ quizzes and 2.1M practice questions across 500+ global exams.
A Field-Ready Study Guide for Forward Deployed Engineers (FDEs)
Project management in the field isn’t about Jira sprints or Scrum ceremonies—it’s about delivering working software in chaotic, high-stakes environments while keeping the customer mission alive. As an FDE, you’ll often work in classified networks, disaster zones, or enterprise environments with strict security constraints. Your "Agile" might mean: - Deploying an ML model on-premise inside a classified DoD network where you can’t use cloud APIs, Docker is restricted, and every dependency must be air-gapped.- Building a data pipeline for disaster response where the schema changes hourly, the customer’s "requirements" are vague, and the system must work offline.- De-escalating a customer during go-live week when their CTO is screaming because the system crashed, and you have to triage, debug, and deploy a fix in 2 hours—while documenting everything for compliance.
This guide gives you field-tested patterns for managing backlogs, prioritizing work, and keeping customers (and your sanity) intact.
Field Tip: Always keep these separate in your tracking tool (e.g., Jira epics labeled [CUSTOMER] vs. [ENG]). Customers prioritize their backlog; you prioritize yours.
[CUSTOMER]
[ENG]
Ask vs. Infer
Field Tip: Use discovery scripts (Python/Pandas) to validate the "ask" before writing a line of production code.
Field-Ready Agile (Fragile)
Tools: Use GitLab/GitHub Issues (for lightweight tracking), Slack threads (for async updates), and Markdown docs (for runbooks).
Priority Matrix (Mission vs. Noise)
Field Tip: Use emoji in Slack/Jira to signal priority (? = Do Now, ⏳ = Schedule, ?️ = Ignore).
Air-Gapped Deployment
pip download -r requirements.txt
apt-mirror
nexus
Tools: dpkg, rpm, docker save/load, terraform init -backend-config=local.hcl.
dpkg
rpm
docker save/load
terraform init -backend-config=local.hcl
Customer Escalation Playbook
Field Tip: Always record the call (with permission) for compliance.
Technical Debt in the Field
Field Tip: Use /health endpoints (e.g., FastAPI’s @app.get("/health")) and dead man’s switches (e.g., "If this job doesn’t run in 24h, alert the team").
/health
@app.get("/health")
Deployment Constraints
sudo
podman
docker pull
docker save
docker load
tmpfs
curl --resolve
Tools: strace, tcpdump, nslookup, dig.
strace
tcpdump
nslookup
dig
Change Control Board (CCB)
Field Tip: Always carry a printed copy of approvals—digital records can disappear.
Field-Ready Documentation
RUNBOOK.md
DEPLOYMENT.md
git clone
pip install -r requirements.txt
python main.py --config prod.yaml
/var/log/app.log
Tools: mkdocs, pandoc, gitbook.
mkdocs
pandoc
gitbook
Customer Proxy
A single point of contact (POC) who translates between you and the customer. In the field:
Field-Ready Testing
curl http://localhost:8080/health
200 OK
python validate_data.py --input customer_data.csv
ab -n 1000 -c 100 http://localhost:8080/api
pytest
locust
curl
jq
Goal: Understand what the customer thinks they need vs. what they actually need.Steps: 1. Run a discovery script (Python/Pandas) to validate the "ask." python # Example: Validate if the customer's "daily sales report" is even possible import pandas as pd df = pd.read_csv("customer_data.csv") print(f"Missing values: {df.isnull().sum()}") print(f"Unique dates: {df['date'].nunique()}") 2. Interview stakeholders (use the 5 Whys technique): - "Why do you need this report?" → "To track sales." - "Why do you need to track sales?" → "To hit quarterly targets." - "Why are you missing targets?" → "Because fraudulent transactions are inflating numbers." - Infer: They don’t need a report—they need anomaly detection.3. Write a one-pager (Markdown) summarizing: - The ask (e.g., "Daily sales report"). - The infer (e.g., "Fraud detection model"). - The data sources (e.g., "CSV from ERP system"). - The constraints (e.g., "No cloud APIs, must run on-premise").
python # Example: Validate if the customer's "daily sales report" is even possible import pandas as pd df = pd.read_csv("customer_data.csv") print(f"Missing values: {df.isnull().sum()}") print(f"Unique dates: {df['date'].nunique()}")
Goal: Create a prioritized list of work that balances customer needs and technical reality.Steps: 1. List all asks (from discovery) in a Jira/GitHub Issues board. - Label them [CUSTOMER] or [ENG]. - Example: - [CUSTOMER] Add fraud detection to sales dashboard (? High priority). - [ENG] Upgrade Python 3.7 → 3.11 (⏳ Schedule).2. Prioritize using the Mission vs. Noise matrix (see Key Terms). - Do Now: Critical bugs, mission-critical features. - Schedule: Tech debt, non-urgent features. - Delegate: Low-impact asks (assign to PM). - Ignore: Noise (e.g., "Can we add a dark mode?").3. Break down the top 3 "Do Now" items into field-ready tasks: - Example for "Add fraud detection": - [ENG] Write data validation script (Python). - [ENG] Train anomaly detection model (scikit-learn). - [CUSTOMER] Integrate model into dashboard (Streamlit). - [ENG] Deploy model to on-premise server (Docker + docker save).
[CUSTOMER] Add fraud detection to sales dashboard
[ENG] Upgrade Python 3.7 → 3.11
[ENG] Write data validation script
[ENG] Train anomaly detection model
[CUSTOMER] Integrate model into dashboard
[ENG] Deploy model to on-premise server
Goal: Get the software running in the customer’s environment without breaking anything.Steps: 1. Pre-deployment checklist: - [ ] Dependencies: pip download -r requirements.txt (for air-gapped). - [ ] Configuration: prod.yaml (not dev.yaml). - [ ] Permissions: chmod 644 config.yaml. - [ ] Health checks: curl http://localhost:8080/health.2. Deploy in stages: - Stage 1 (Dev): Deploy to a customer-provided dev environment (e.g., dev.customer.internal). bash scp -i ~/.ssh/customer_key app.tar.gz [email protected]:/tmp ssh -i ~/.ssh/customer_key [email protected] "tar -xzf /tmp/app.tar.gz && cd app && ./deploy.sh" - Stage 2 (Staging): Deploy to a mirror of prod (e.g., staging.customer.internal). - Stage 3 (Prod): Deploy to prod (e.g., prod.customer.internal). - Always have a rollback plan (e.g., git checkout v1.0 && ./deploy.sh).3. Validate in prod: - Smoke test: curl http://prod.customer.internal:8080/health. - Data test: python validate_data.py --input prod_data.csv. - User test: "Can you log in and click around?"
prod.yaml
dev.yaml
chmod 644 config.yaml
dev.customer.internal
bash scp -i ~/.ssh/customer_key app.tar.gz [email protected]:/tmp ssh -i ~/.ssh/customer_key [email protected] "tar -xzf /tmp/app.tar.gz && cd app && ./deploy.sh"
staging.customer.internal
prod.customer.internal
git checkout v1.0 && ./deploy.sh
curl http://prod.customer.internal:8080/health
python validate_data.py --input prod_data.csv
Goal: Fix the issue, keep the customer calm, and document everything.Steps: 1. Acknowledge the issue (even if you don’t know the cause yet): - "I see the issue—we’re investigating." 2. Isolate the problem: - Is it user error? (e.g., "Did you enter the correct API key?") - Is it environment-specific? (e.g., "Does this happen in staging?") - Is it data-specific? (e.g., "Can you send me the last 100 lines of logs?") 3. Triage: - Check logs: tail -n 100 /var/log/app.log. - Reproduce: curl -v http://localhost:8080/api. - Mitigate: "Here’s a workaround while we fix the root cause." 4. Fix and deploy: - Hotfix: git commit -m "fix: null pointer in API" && git push && ./deploy.sh. - Rollback if needed: git checkout v1.0 && ./deploy.sh.5. Postmortem: - Write a Markdown doc (POSTMORTEM.md) with: - What happened. - Root cause. - How it was fixed. - How to prevent it in the future.
tail -n 100 /var/log/app.log
curl -v http://localhost:8080/api
git commit -m "fix: null pointer in API" && git push && ./deploy.sh
POSTMORTEM.md
Goal: Keep the system running without accumulating mission-breaking tech debt.Steps: 1. Schedule tech debt sprints (e.g., "Every 3rd sprint is for upgrades"). - Example tasks: - [ENG] Upgrade Python 3.7 → 3.11. - [ENG] Add retry logic to data pipeline. - [ENG] Rotate API keys.2. Automate health checks: - Add a /health endpoint (e.g., FastAPI): python @app.get("/health") def health(): return {"status": "ok", "version": "1.0.0"} - Set up dead man’s switches (e.g., "If this job doesn’t run in 24h, alert the team").3. Document everything: - Update RUNBOOK.md with new troubleshooting steps. - Add deployment notes to DEPLOYMENT.md.
[ENG] Add retry logic to data pipeline
[ENG] Rotate API keys
python @app.get("/health") def health(): return {"status": "ok", "version": "1.0.0"}
500
ERROR: Something went wrong
logging.error("Failed to connect to DB: %s", e)
DEBUG=True
curl /health
python validate.py
ab -n 1000
Final Field Tip: In the field, your job isn’t to write perfect code—it’s to keep the mission alive. Prioritize ruthlessly, document everything, and always have a rollback plan. ?
Join 4M+ learners. Unlock unlimited quizzes, wrong-answer tracking, flashcards + reminders, study guides, and 1-on-1 challenges.